享元模式:运用共享技术有效地支持大量细粒度的对象。
package com.flyweight;
public abstract class Flyweight {
public abstract void operation(int extrinsicstate);
}
package com.flyweight;
public class ConcreteFlyweight extends Flyweight{
@Override
public void operation(int extrinicstate) {
System.out.println("具体Flyweight:" + extrinicstate);
}
}
package com.flyweight;
public class UnsharedConcreteFlyweight extends Flyweight{
@Override
public void operation(int extrinicstate) {
System.out.println("不共享的具体Flyweight:" + extrinicstate);
}
}
package com.flyweight;
import java.util.HashMap;
import java.util.Map;
public class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();
public Flyweight getFlyweight(String key) {
Flyweight flyweight = null;
if(flyweights.containsKey(key)) {
flyweight = flyweights.get(key);
}else {
flyweight = new ConcreteFlyweight();
flyweights.put(key, flyweight);
}
return flyweight;
}
public int getFlyweightCount() {
return flyweights.size();
}
}
package com.flyweight;
public class Text {
public static void main(String[] args) {
int extrinsicstate = 12;
FlyweightFactory factory = new FlyweightFactory();
Flyweight f1 = factory.getFlyweight("111");
Flyweight f2 = factory.getFlyweight("222");
Flyweight f3 = factory.getFlyweight("222");
Flyweight unf = new UnsharedConcreteFlyweight();
unf.operation(--extrinsicstate);
unf.operation(--extrinsicstate);
System.out.println(factory.getFlyweightCount());
}
}
Flyweight类,它是所有具体享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态。
ConcreteFlyweight是继承Flyweight超类或现实Flyweight接口,并为内部状态增加存储空间。
UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类。因为Flyweight接口共享成为可能,但它并不强制共享。
FlyweightFactory,是一个享元工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个。
享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。