Flyweight模式
应用场景
- 一个系统有大量的对象
- 这些对象耗费大量的内存
- 这些对象的状态中的大部分都可以外部化
- 这些对象可以按照内部状态分成很多的组,当把外部.对象从对象中剔除时,每一个组都可以仅用一个对象代替
本质
- 分离与共享
优点
- 大幅度地降低内存中对象的数量, 节省内存空间
缺点
- 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
- 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间变长。
角色
-
Flyweight:
按照通常方式编写程序会导致程序变重,所以如果能够共享时,率会比较好。Flyweight角色表示的就是那些实力会被共享的类。 -
FlyweightFactory
FlyweightFactory角色是生成Flyweight角色的工厂,在工厂中生成Flyweight角色可以实现共享实例。 -
Client
Client角色使用FlyweightFactory角色来生成Flyweight角色。
设计模式的类图
示例程序
示例程序的类图
示例代码
public abstract class FlyWeight {
public abstract void operation(int extrinsicState);
}
public class ConcreteFlyWeight extends FlyWeight {
@Override
public void operation(int extrinsicState) {
System.out.println("具体的FlyWeight "+extrinsicState);
}
}
public class UnsharedFlyWeight extends FlyWeight {
@Override
public void operation(int extrinsicState) {
System.out.println("不具体的FlyWeight "+extrinsicState);
}
}
public class FlyWeightFactory {
private Hashtable<String, FlyWeight> hashtable = new Hashtable<String, FlyWeight>();
public FlyWeight getFlyWeight(String key) {
if (hashtable.containsKey(key)) {
return hashtable.get(key);
} else {
ConcreteFlyWeight concreteFlyWeight = new ConcreteFlyWeight();
hashtable.put(key, concreteFlyWeight);
return concreteFlyWeight;
}
}
public int getCount() {
return hashtable.size();
}
}
public class Client {
public static void main(String[] args) {
int extrinsicstate = 10;
FlyWeightFactory factory = new FlyWeightFactory();
FlyWeight f1 = factory.getFlyWeight("X");
f1.operation(--extrinsicstate);
System.out.println(f1);
FlyWeight f2 = factory.getFlyWeight("Y");
f2.operation(--extrinsicstate);
FlyWeight f3 = factory.getFlyWeight("Z");
f3.operation(--extrinsicstate);
FlyWeight f4 = new UnsharedFlyWeight();
f4.operation(--extrinsicstate);
}
}
拓展思路
相关设计模式
-
Proxy模式
如果生成实例的处理需要花费较长时间,那么使用Flyweight模式可以提高程序的处理速度。
而Proxy模式则是通过设置代理提高程序的处理速度。 -
Composite模式
有时可以使用Flyweight模式共享Composite模式中的Leaf角色。 -
Singleton模式
在FlyweightFactony 角色中有时会使用Singleton模式。
此外,如果使用了Singleton模式,由于只会生成个Singleton角色,因此所有使用该实例的
地方都共享同一个实例。在Singleton角色的实例中只持有intrinsic可共享信息。
满足的原则
- 依赖倒置原则
- 迪米特法则
- 里氏替换原则
- 单一职责原则
- 开闭原则