享元模式 Flyweight Pattern
定义
享元(Flyweight)模式的定义:运用共享技术来有效地支持大量细粒度对象的复用。 它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。享元模式适用于系统中有大量相似对象的情况,这些对象可能只在某些方面有所不同,而大部分状态是相同的。
角色
- 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
- 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
- 非享元(UnSharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
- 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检查系统中是否存在符合要求的享元对象, 如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
类图

解释
在享元模式中,对象的状态被分为两部分:
- 内部状态(Intrinsic State): 内部状态是对象的固有属性,是不可改变的。 这些状态可以被多个对象共享,因为它们是不变的,所以可以在享元对象内部直接保存。
- 外部状态(Extrinsic State): 外部状态是对象的可变属性,依赖于环境,不能被共享。 这些状态在享元对象的外部管理,当需要使用享元对象时,再将这些状态传递给享元对象。
享元模式的核心在于创建一个享元对象池,这个池子包含了一组具有共同内部状态的享元对象。当需要创建新对象时,首先检查池中是否已有满足需求的享元对象,如果有,则重用这个对象;如果没有,则创建一个新的享元对象加入到池中。这样可以显著减少创建大量相似对象时的内存消耗。
代码案例
ts
// 子系统(Sub System)A角色
class SubSystemA {
public operation() {
console.log("调用SubSystemA角色的方法operation()");
}
}
// 子系统(Sub System)B角色
class SubSystemB {
public operation() {
console.log("调用SubSystemB角色的方法operation()");
}
}
// 外观(Facade)角色
export class Facade {
private sa = new SubSystemA();
private sb = new SubSystemB();
wrapOperation() {
this.sa.operation();
this.sb.operation();
}
}
// client
()=>{
const facade = new Facade();
facade.wrapOperation();
}()
// 调用SubSystemA角色的方法operation()
// 调用SubSystemB角色的方法operation()