设计模式十二--享元模式

定义

使用共享变量可有效地支持大量的细粒度对象。享元模式是以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内部状态和外部状态。

享元模式的角色

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 pool = new HashMap();
  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)

你可能感兴趣的:(设计模式十二--享元模式)