美文网首页java设计模式笔记
设计模式十二--享元模式

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

作者: 朽木亦自雕 | 来源:发表于2019-03-07 22:48 被阅读13次

    定义

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

    享元模式的角色

    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)

    相关文章

      网友评论

        本文标题:设计模式十二--享元模式

        本文链接:https://www.haomeiwen.com/subject/gdzqlqtx.html