# 享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少创建对象的数量,从而提高性能。享元模式通过共享尽可能多的状态来实现这一点,从而使得多个细粒度的对象可以共享相同的外部状态。

# 享元模式的主要角色

  1. 抽象享元类(Flyweight):定义一个接口,用于接收并存储享元状态。
  2. 具体享元类(Concrete Flyweight):实现抽象享元类,包含具体的享元状态。
  3. 非共享享元类(Unshared Concrete Flyweight):包含只能内部使用的状态,每个实例的状态是唯一的。
  4. 工厂类(Flyweight Factory):负责创建并管理享元对象,确保相同享元状态的实例被复用。

# 示例代码

以下是一个使用享元模式的简单示例:

// 抽象享元类
class Flyweight {
  constructor(intrinsicState) {
    this.intrinsicState = intrinsicState;
  }

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

// 具体享元类
class ConcreteFlyweight extends Flyweight {}

// 非共享享元类
class UnsharedConcreteFlyweight {
  constructor() {
    this.extrinsicState = {};
  }

  setExtrinsicState(state) {
    this.extrinsicState = state;
  }

  getExtrinsicState() {
    return this.extrinsicState;
  }
}

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

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

// 使用享元模式
const factory = new FlyweightFactory();

const flyweight1 = factory.getFlyweight("A");
flyweight1.operation("X");

const flyweight2 = factory.getFlyweight("A");
flyweight2.operation("Y"); // 共享同一个实例

console.log(flyweight1 === flyweight2); // 输出: true

# 享元模式的优势和适用场景

优点

  • 减少对象数量,降低内存使用。
  • 提高性能,因为享元对象可以被多个客户端共享。
  • 符合开闭原则,可以通过添加新的具体享元类来扩展系统。

适用场景:

  • 系统中存在大量相同或相似的对象。
  • 对象的大部分状态可以外部化,从而减少对象的数量。
  • 需要支持大量的细粒度对象。

# 注意事项

享元模式可能会使代码变得复杂,因为需要管理共享和非共享的状态,并且确保正确地复用对象。

享元模式不适合那些不希望共享状态的对象。