定义
使用共享变量可有效地支持大量的细粒度对象。享元模式是以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内部状态和外部状态。
享元模式的角色
1:抽象享元角色(Flyweight)
该角色对享元类进行抽象,需要外部状态的操作可以通过参数的形式将外部状态传入。
public interface Flyweight{
public abstract void operations(String extrinsicState);
}
2:具体享元角色(ConcreteFlyweight)
该角色实现抽象享元定义的业务,注意享元对象的内部状态必须与环境无关,从而使得享元对象可以在内部系统共享。
public class ConcreteFlyweight implements Flyweight{
private String intrinsicState;
public ConcreteFlyweight(String intrinsicState){
this.intrinsicState= intrinsicState;
}
public void operations(String extrinsicState){
System.out.println("内部状态:" + intrinsicState + ", 外部状态:" + extrinsicState);
}
}
3:享元工厂角色(FlyweightFactory)
该角色是就是构造一个池容器,负责创建和管理享元角色,并提供从池容器中获取对象的方法,保证享元对象可以被系统适当的共享。
public class FlyweightFactory{
private static Map<String, Flyweight> pool = new HashMap<String, Flyweight>();
public FlyweightFactory(){};
public static Flyweight getFlyweight(String intrinsicState){
Flyweight flyweight = pool.get(intrinsicState);
if(null == flyweight){
flyweight = new ConcreteFlyweight(intrinsicState);
pool.put(intrinsicState, flyweight);
}
return flyweight;
}
}
4:客户端角色(Client)
该角色需要自行存储所有享元对象的外部形态。
public class Client{
private static Flyweight flyweight;
private static String intrinsicState = "myIntrinsicState";
public static void main(String [] args){
flyweight = FlyweightFactory.getFlyweight(intrinsicState);
flyweight.operations();
}
}
优点
大幅度减少内存中对象的数量,降低程序中内存的占用,提高性能。
缺点
1:增加了系统的复杂性,使得程序的逻辑随之复杂。
2:享元模式将享元对象的状态外部化,而读取外部运行状态使得运行时间变长。
使用场景
1:系统中有大量相似对象。
2:需要缓冲池的场景。
3:细粒度的对象都具备较接近外部状态,而且内部状态与环境无关,即对象没有特定身份。
参考资料:设计模式(java)