时间: 2020-09-12|50次围观|0 条评论

定义

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

享元模式的角色

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.jianshu.com/p/73a1c9ea84df

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《设计模式十二–享元模式
   

还没有人抢沙发呢~