设计模式-享元模式
1.UML类图
FlyweightFactory是一个享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享Flywight,当用户请求一个Flywight时,FlyweightFactory对象提供一个已经创建好的实例或者创建一个,如果实例不存在的化话。Flyweight是所有享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态。ConcreteFlyweight继承Flyweight超类或者实现Flyweight接口,并为内部状态增加存储空间。UnsharedConcreteFlyweight指那些不需要共享的Flyweight子类,因为Flyweight接口使共享成为可能,但它并不强制共享。
2.示例代码
public abstract class Flyweight {
public abstract void operation(int number);
}
public class ConcreteFlyweight extends Flyweight {
@Override
public void operation(int number) {
System.out.println("具体Flyweight: " + number);
}
}
public class UnsharedConcreteFlyweight extends Flyweight {
@Override
public void operation(int number) {
System.out.println("不共享的具体Flyweight: " + number);
}
}
public class FlyweightFactory {
private HashMap flyweights = new HashMap();
public FlyweightFactory() {
flyweights.put("x", new ConcreteFlyweight());
flyweights.put("y", new ConcreteFlyweight());
flyweights.put("z", new ConcreteFlyweight());
}
public Flyweight getFlyweight(String key) {
return (Flyweight) flyweights.get(key);
}
}
public class Client {
public static void main(String[] args) {
int number = 22;
FlyweightFactory flyweightFactory = new FlyweightFactory();
Flyweight fx = flyweightFactory.getFlyweight("x");
fx.operation(--number);
Flyweight fy = flyweightFactory.getFlyweight("y");
fy.operation(--number);
Flyweight fz = flyweightFactory.getFlyweight("z");
fz.operation(--number);
Flyweight uf = new UnsharedConcreteFlyweight();
uf.operation(--number);
}
}
3.特点
(1)享元模式,运用共享技术有效地支持大量细粒度的对象。
(2)在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了,比如用户对于网站来说就是外部状态。享元模式可以避免大量非常相似类的开销。在程序设计过程中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本都是相同的,有时就能受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
(3)如果一个应用使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以是外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。