享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来最小化内存或计算开销,以提高性能。在享元模式中,对象被分为两种状态:内部状态和外部状态。内部状态存储在享元对象内部,而外部状态则由客户端传递进来。
核心思想是尽量减少相似对象的数量,通过共享相同的部分来减小系统中对象的数量,从而降低资源消耗。
以下是享元模式的一般结构和实现要点:
-
享元接口(Flyweight): 定义了具体享元类的共享接口,通过这个接口可以接收并作用于外部状态。
-
具体享元类(ConcreteFlyweight): 实现了享元接口,包含内部状态,可以被共享。
-
非共享具体享元类(UnsharedConcreteFlyweight): 一些不能被共享的具体享元类,通常是因为包含了外部状态或者无法共享的原因。
-
享元工厂(FlyweightFactory): 负责创建和管理享元对象,维护一个享元池用于存储已经创建好的享元对象,以确保对象的共享性。
-
客户端(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
则由客户端传递。如果多个客户端请求相同的内部状态,享元工厂会返回相同的享元对象,实现了对象 的共享。