UML类图
使用场景
1、系统中有大量对象。 2、这些对象消耗大量内存。 3、这些对象的状态大部分可以外部化。 4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。 5、系统不依赖于这些对象身份,这些对象是不可分辨的。
如:池技术。String常量池,缓冲池,连接池,线程池等等。
代码实现
享元模式将共有的内部属性抽象出来,将不同的属性设置成外部属性。
抽象的公有方法
public abstract class Flyweight {
public abstract void operation(int extrinsicstate);
}
public class ConcreteFlyweight extends Flyweight {
private String intrinsicState; //内部状态
public void setIntrinsicState(String intrinsicState){
this.intrinsicState = intrinsicState;
}
@Override
public void operation(int extrinsicstate) {
System.out.println("内部状态:" + intrinsicState + ",外部状态:" + extrinsicstate);
}
}
public class UnsharedConcreteFlyweight extends Flyweight {
private String intrinsicState; //内部状态
public void setIntrinsicState(String intrinsicState){
this.intrinsicState = intrinsicState;
}
@Override
public void operation(int extrinsicstate) {
System.out.println("不共享内部状态:" + intrinsicState + ",外部状态:" + extrinsicstate);
}
}
import java.util.Hashtable;
public class FlyweightFactory {
private Hashtable<String, Flyweight> flyweights = new Hashtable<String, Flyweight>();
public Flyweight getFlyweight(String key){
if(flyweights.contains(key)){
return flyweights.get(key);
}else{
ConcreteFlyweight flyweight = new ConcreteFlyweight();
flyweight.setIntrinsicState(key);
flyweights.put(key, flyweight);
return flyweight;
}
}
}
public class Client {
public static void main(String[] args) {
int state = 100;
FlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight = factory.getFlyweight("常量对象");
UnsharedConcreteFlyweight unsharedFlyweight = new UnsharedConcreteFlyweight();
unsharedFlyweight.setIntrinsicState("不共享对象");
flyweight.operation(state);
unsharedFlyweight.operation(state);
}
}
输出结果:
内部状态:常量对象,外部状态:100
不共享内部状态:不共享对象,外部状态:100