设计模式之13--享元模式

来源:互联网 发布:usb网络接口转换器 编辑:程序博客网 时间:2024/05/18 00:34

享元模式学习笔记

对于有时候系统中需要产生大量对象的情况,会造成系统性能下降,而这些对象之间的差别可能很小。比如围棋中的棋子(之间唯一不同的也就是坐标),又或者是火车票(相同的都是始发站和目的站,不同的是票的座位)。那么如果可以做到只保存一份对象在系统中,又不影响客户类操作这一系列的对象呢,这边就需要使用到享元模式。

享元模式能够以共享的方式做到支持大量细粒度对象的重用,关键是享元模式区分内部和外部状态,内部状态存储在享元对象内部并且不会随着环境的变化而变化,在享元池中正是通过内部状态来获得相应的享元对象。而外部状态正好相反,它是不可以共享的、随环境改变而改变的,只有在享元对象被创建之后,然后将外部对象传入那么就可以得到实际的对象了。(理解的是考虑火车票,比如从上海->北京,1000张票不可能产生1000个对象的,那么系统只需要在享元池中保存一个上海->北京的火车票,而表示一个具体的火车票的时候从享元池中取出享元对象然后传入座位和车厢就可以表示一个具体的车票。那么上海、北京这就是内部对象,而座位和车厢就是会变的,属于外部状态)。

定义:享元模式运用共享技术有效的支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,是一种结构型模式。

如下图就是享元模式的结构图:

从上图中可以发现包含如下几个角色:

  1. FlyWeight抽象享元类:声明了具体享元类的公共的方法,这些方法可以向外部提供享元对象的内部状态,也可以通过这些方法设置外部状态。
  2. ConcreteFlyWeight具体享元类:为享元对象的内部状态提供存储空间。实现抽象享元类中声明的方法
  3. UnSharedConcreteFlyWeight非共享具体享元类:需要该类对象的时候直接实例化创建
  4. FlyWeightFactory享元工厂类:创建并管理享元类,我可以通过工厂模式来设计一个享元池,Map
class FlyWeight {    private String intrinsicState;    public FlyWeight(String intrinsicState) {        this.intrinsicState = intrinsicState;    }    public void operation(String extrinsicState) {        /*TODO*/    }}class FlyWeightFactory {    private HashMap flyweights = new HashMap();    public FlyWeight getFlyWeight(String key) {        if(flyweights.containsKey(key)            return (FlyWeight)flyweights.get(key);        else {            FlyWeight fw = new ConcreteFlyWeight();            flyweights.put(key, fw);            return fw;        }    }}

总结:
如果系统中存在大量相似的细粒度对象,那么就可以使用享元模式来极大的减少内存中对象的数量,不过得需要区分出享元对象的内部状态和外部状态。另外可以通过一个享元池来管理系统中的享元对象。

0 0
原创粉丝点击