例子来源:《设计模式之禅》——第28章 享元模式
Flyweight:抽象享元角色
ConcreteFlyweight:具体享元角色
unsharedConcreteFlyweight:不可共享的享元角色
FlyweightFactory:享元工厂
Flyweight
public abstract class Flyweight {
private String intrinsic;
// 外部状态
protected final String Extrinsic;
// 要求享元角色必须接受外部状态
public Flyweight(String extrinsic) {
Extrinsic = extrinsic;
}
// 定义业务操作
public abstract void operate();
// 内部状态的getter/setter
public String getIntrinsic() {
return intrinsic;
}
public void setIntrinsic(String intrinsic) {
this.intrinsic = intrinsic;
}
}
ConcreteFlyweightA
public class ConcreteFlyweightA extends Flyweight {
// 接受外部状态
public ConcreteFlyweightA(String extrinsic) {
super(extrinsic);
}
// 根据外部状态进行逻辑处理
@Override
public void operate() {
System.out.println("ConcreteFlyweightA");
}
}
ConcreteFlyweightB
public class ConcreteFlyweightB extends Flyweight {
// 接受外部状态
public ConcreteFlyweightB(String extrinsic) {
super(extrinsic);
}
// 根据外部状态进行逻辑处理
@Override
public void operate() {
System.out.println("ConcreteFlyweightA");
}
}
FlyweightFactory
public class FlyweightFactory {
// 定义一个池容器
private static HashMap<String, Flyweight> pool = new HashMap<String, Flyweight>();
public static Flyweight getFlyweight(String Extrinsic) {
// 需要返回的对象
Flyweight flyweight = null;
// 在池中没有该对象
if (pool.containsKey(Extrinsic)) {
flyweight = pool.get(Extrinsic);
} else {
// 根据外部状态创建享元对象
flyweight = new ConcreteFlyweightA(Extrinsic);
// 放置到池中
pool.put(Extrinsic, flyweight);
}
return flyweight;
}
}
Client
public class Client {
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
String key = "test" + i;
FlyweightFactory.getFlyweight(key);
}
Flyweight flyweight = FlyweightFactory.getFlyweight("test0");
if(flyweight != null){
flyweight.operate();
}else{
flyweight.operate();
}
}
}
享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能。