应用场景
当我们短时间内创建大量相同或相似对象的时候,很容易使内存爆掉。尤其是在做应用服务器时,创建大量的对象是不可避免的。但是使用享元模式的中的共享技术可以相对降低在创建对象时对内存的需求。享元模式是池技术的重要实现方式。
关系类图
享元模式要求以共享方式重用细粒度对象。它将对象的信息分为两部分内部状态和外部状态。
内部状态:对象共享出来的信息,存储在享元对象的内部并且不会随环境的改变而改变。
外部状态: 外部状态是对象得意依赖的一个标记,是随环境的改变而改变的,不可共享的状态。
下面是其类图信息
Flyweight-----抽象享元角色
产品的抽象类,声明公共方法,这些方法可以向外界提供内部状态,设置外部状态
ConcreteFlyweight-----具体享元角色
一个具体的产品类,实现抽象角色定义的业务,为内部状态提供成员变量的存储
unsharedConcreteFlyweight------不可共享的享元角色
不能被共享的类单独拿出来处理
FlyweightFactory-----享元工厂
构造一个池容器,同时提供从池中获取对象的方法
示例代码
抽象享元角色
abstract class Flyweight{ //内部状态 private String intrinsic; //外部状态 protected final String Extrinsic; public Flyweight(String _Extrinsic){ this.Extrinsic = _Extrinsic; } //定义业务操作 public abstract void operate(); //内部状态的获取和设置 public String getIntrinsic() { return intrinsic; } public void setIntrinsic(String intrinsic) { this.intrinsic = intrinsic; } }
具体享元角色
class ConcreteFlyweight extends Flyweight{ //接受外部状态 public ConcreteFlyweight(String _Extrinsic){ super(_Extrinsic); } @Override public void operate() { // TODO 业务逻辑 } }
享元工厂
class FlyweightFactoty{ //定义一个池容器 private static HashMap<String, Flyweight> pool = new HashMap<>(); //共享工厂 public static Flyweight getFlyweight(String Extrinsic){ //需要返回的对象 Flyweight flyweight = null; //在池中没有该对象 if(pool.containsKey(Extrinsic)){ flyweight = new ConcreteFlyweight(Extrinsic); }else{ //根据外部状态创建享元对象 flyweight = new ConcreteFlyweight(Extrinsic); pool.put(Extrinsic, flyweight); } return flyweight; } }