# 享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少创建对象的数量,从而提高性能。享元模式通过共享尽可能多的状态来实现这一点,从而使得多个细粒度的对象可以共享相同的外部状态。
# 享元模式的主要角色
- 抽象享元类(Flyweight):定义一个接口,用于接收并存储享元状态。
- 具体享元类(Concrete Flyweight):实现抽象享元类,包含具体的享元状态。
- 非共享享元类(Unshared Concrete Flyweight):包含只能内部使用的状态,每个实例的状态是唯一的。
- 工厂类(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
# 享元模式的优势和适用场景
优点:
- 减少对象数量,降低内存使用。
- 提高性能,因为享元对象可以被多个客户端共享。
- 符合开闭原则,可以通过添加新的具体享元类来扩展系统。
适用场景:
- 系统中存在大量相同或相似的对象。
- 对象的大部分状态可以外部化,从而减少对象的数量。
- 需要支持大量的细粒度对象。
# 注意事项
享元模式可能会使代码变得复杂,因为需要管理共享和非共享的状态,并且确保正确地复用对象。
享元模式不适合那些不希望共享状态的对象。