享元模式
运用共享技术有效的支持大量细粒度的对象。
类结构图
FlyweightFactory
一个享元类,用来创建并管理 Flyweight 对象。它主要是用来确保合理地共享 Flyweight,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个已创建的实例。
Flyweight
所有具体享元类的超类或接口,通过这个接口,Flyweight 可以接受并作用于外部状态。
ConcreteFlyweight
实现了 Flyweight 超类或接口,并为内部状态增加存储空间。
UnsharedConcreteFlyweight
指那些不需要的共享的 Flyweight 子类。因为 Flyweight 接口共享成为可能,但它并不能强制共享。
代码示例
public interface Flyweight {
void operation(int extrinsicState);
}
public class ConcreteFlyweight implements Flyweight {
@Override
public void operation(int extrinsicState) {
System.out.println("具体的 Flyweight: " + extrinsicState);
}
}
public class UnsharedConcreteFlyweight implements Flyweight {
@Override
public void operation(int extrinsicState) {
System.out.println("不共享的具体 Flyweight: " + extrinsicState);
}
}
public class FlyweightFactory {
private Map<String, Flyweight> flyweightMap = new HashMap<>();
public FlyweightFactory() {
this.flyweightMap.put("X", new ConcreteFlyweight());
this.flyweightMap.put("Y", new ConcreteFlyweight());
this.flyweightMap.put("Z", new ConcreteFlyweight());
}
public Flyweight getFlyweight(String key) {
return this.flyweightMap.get(key);
}
}
客户端示例
public class FlyweightClient {
public static void main(String[] args) {
int extrinsicState = 22;
FlyweightFactory factory = new FlyweightFactory();
Flyweight fx = factory.getFlyweight("X");
fx.operation(--extrinsicState);
Flyweight fy = factory.getFlyweight("Y");
fy.operation(--extrinsicState);
Flyweight fz = factory.getFlyweight("Z");
fz.operation(--extrinsicState);
UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
uf.operation(--extrinsicState);
}
}
运行结果
具体的 Flyweight: 21
具体的 Flyweight: 20
具体的 Flyweight: 19
不共享的具体 Flyweight: 18
Process finished with exit code 0
内部状态与外部状态
在享元对象内部并且不会随着环境改变而改变的共享部分,可以成为享元对象的内部状态,而随着环境改变而改变的、不可以共享的状态就是外部状态。
使用场景
如果一个应用程序使用了大量的对象,而大量使的这些对象造成了很大的存储开销时就应该考虑使用;
优点
有效的降低系统中对象的实例数量,省资源。
缺点
使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。