跳到主要内容

享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来最小化内存或计算开销,以提高性能。在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态存储在享元对象内部,而外部状态则由客户端传递进来。

核心思想是尽量减少相似对象的数量,通过共享相同的部分来减小系统中对象的数量,从而降低资源消耗。

以下是享元模式的一般结构和实现要点:

  1. 享元接口(Flyweight): 定义了具体享元类的共享接口,通过这个接口可以接收并作用于外部状态。

  2. 具体享元类(ConcreteFlyweight): 实现了享元接口,包含内部状态,可以被共享。

  3. 非共享具体享元类(UnsharedConcreteFlyweight): 一些不能被共享的具体享元类,通常是因为包含了外部状态或者无法共享的原因。

  4. 享元工厂(FlyweightFactory): 负责创建和管理享元对象,维护一个享元池用于存储已经创建好的享元对象,以确保对象的共享性。

  5. 客户端(Client): 维护外部状态,并将外部状态传递给享元对象。

以下是一个简单的 JavaScript 示例:

// 享元接口
class Flyweight {
operation(extrinsicState) {
throw new Error('Operation must be implemented by concrete flyweights');
}
}

// 具体享元类
class ConcreteFlyweight extends Flyweight {
constructor(intrinsicState) {
super();
this.intrinsicState = intrinsicState;
}

operation(extrinsicState) {
console.log(`Concrete Flyweight: Intrinsic - ${this.intrinsicState}, Extrinsic - ${extrinsicState}`);
}
}

// 享元工厂
class FlyweightFactory {
constructor() {
this.flyweights = {};
}

getFlyweight(key) {
if (!this.flyweights[key]) {
this.flyweights[key] = new ConcreteFlyweight(key);
}
return this.flyweights[key];
}
}

// 客户端
const factory = new FlyweightFactory();
const flyweight1 = factory.getFlyweight('A');
const flyweight2 = factory.getFlyweight('B');
const flyweight3 = factory.getFlyweight('A');

flyweight1.operation('X');
flyweight2.operation('Y');
flyweight3.operation('Z');

在这个例子中,ConcreteFlyweight 是具体享元类,FlyweightFactory 是享元工厂,客户端通过工厂获取具体享元对象,并传递外部状态。享元对象内部包含了内部状态 intrinsicState,而外部状态 extrinsicState 则由客户端传递。如果多个客户端请求相同的内部状态,享元工厂会返回相同的享元对象,实现了对象的共享。