设计模式读书笔记之享元模式(Flyweight pattern)

享元模式:运用共享技术支持大量细粒度的对象。

记得我年前我读过一次享元模式,当时因为所看的书中的例子不是很好懂,就觉得享元模式无非就是搞个缓冲池保存一些对象然后被共享以免重复创造。

我花了差不多两天的时间来细看享元模式,除了参阅head first,大话设计模式,java与模式,还大量的在网上看网友们的理解. 我发现三本书中都没有举出恰当的例子来说明这个模式,都是牵强附会,为了设计模式而设计模式. 尤其java与模式中的那个咖啡屋的例子.汗!倒是网友提供的例子还比较精彩而且容易理解.
我个人觉得,享元模式和桥接模式一样,与其说是一种设计模式, 不如说是一种设计思想.为什么这么说呢? 因为它不像其他模式,具有鲜明的结构或责任/功能(如factory,builder,singleton是为了创建对象,如adapter,proxy,decorator,visotor,Composite等具有自己独特的结构).

那么享元模式的精要又是什么呢? 有三点:
1 被系统大量使用的细粒度对象;
粒度要有多细,量要有多大,看看jdk中使用的享元模式就知道了,jdk中,Integer,Character,String等都使用了享元模式,他们都是最基础的数据类型,不可谓不细, 他们频繁的参与运算,不可谓不大量.看Integer中:
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
    for(int i = 0; i < cache.length; i++)
 cache[i] = new Integer(i - 128);
    }
}
它对-128到127之间的Integer对象做了缓存以提高performance和降低space.IntegerCache其实就是享元工厂.String虽然不能从jdk源码中看到string pool的实现,但是我们不难通过demo看出其实现方式.
2 划分对象的内蕴属性/状态和外蕴属性/状态;所谓内蕴状态,就是存在对象的内部,不会随着环境变化的状态, 有一个网友说的很好,就是无区别的状态, 即拿掉外蕴属性之后同一类对象没有区别对象的内蕴状态就是对象的元神,只要元神元神无区别,那么对象也就无区别,同时也只有这些无区别的元神可以被共享,我想这也是Flyweight被翻译成享元的原因.外蕴状态就是由客户端指定,会随着环境变化的状态; 对于Integer来说, 他的内蕴属性其实就是他的value(当然它也没有外蕴属性);
3 用一个工厂控制享元的创造;因为享元对象不能被客户端随意创造, 否则就没有意义了.工厂通常提供缓存机制保存已经创造的享元.

享元模式是一种不常用的模式, 翻了很多资料, 也没有发现比较出彩的应用, 我不想写例子, 怕贻笑大方. 尤其我看到大多数的书都给出了Flyweight, ConcreteFlyweight, FlyweightFactory这样的例子, 我觉得如果没有体会享元的精神, 写这样的demo一点意义都没有. 甚至连类图都没有看的意义.

你可能感兴趣的:(设计模式读书笔记之享元模式(Flyweight pattern))