享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
享元模式将对象分为2个状态:内部状态、外部状态
外部状态意指具体享元角色接受的参数
内部状态指可以共享的元素、我们可以理解成是一个方法、也可以理解成是一个属性
抽象享元角色
public abstract class Flyweight {
//内部状态
private String intrinsic;
//外部状态
protected final String Extrinsic;
//要求享元角色必须接受外部状态
public Flyweight(String _Extrinsic) {
this.Extrinsic = _Extrinsic;
}
//内部状态的getter/setter
public String getIntrinsic() {
return intrinsic;
}
public void setIntrinsic(String intrinsic) {
this.intrinsic = intrinsic;
}
//定义业务操作
public abstract void operate();
}
//具体享元角色
public class ConcreteFlyweight extends Flyweight {
//接受外部状态
public ConcreteFlyweight(String _Extrinsic) {
super( _Extrinsic );
}
//具体业务逻辑实现
@Override
public void operate() {
System.out.println("ConcreateFlyWeightA");
}
}
//具体享元角色
public class ConcreteFlyweight1 extends Flyweight {
//接受外部状态
public ConcreteFlyweight1(String _Extrinsic) {
super( _Extrinsic );
}
//具体业务逻辑实现
@Override
public void operate() {
System.out.println("ConcreateFlyWeightB ");
}
}
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 );
System.out.println("找到了");
} else {
//根据外部状态创建享元对象
flyweight = new ConcreteFlyweight1( Extrinsic );
//放置到池中
pool.put( Extrinsic, flyweight );
}
return flyweight;
}
}
public class Test {
public static void main(String[] args) {
Flyweight flyweight = FlyWeightFactory.getFlyweight( "1" );
System.out.println(flyweight);
flyweight.operate();
Flyweight flyweight1 = FlyWeightFactory.getFlyweight( "1" );
flyweight1.operate();
System.out.println(flyweight1);
}
}
com.example.design_example.flyweight.ConcreteFlyweight1@3cd1a2f1
ConcreateFlyWeightB
找到了
ConcreateFlyWeightB
com.example.design_example.flyweight.ConcreteFlyweight1@3cd1a2f1
网友评论