Flyweight
享元模式的本质其实和singleton的概念有些类似,只不过singleton强调的是一个对象,而享元模式描述的一堆“一个对象”。在GOF中举的例子是英文单词,如果为每一个字母都建立一个对象,这样对于内存消耗比较大,于是他实际是只是创建了24个(英文)字符,至于每个字符的位置和颜色都是由一个“外部状态”(实际可以理解为一个实体)通过传递而返回。
享元模式有两个状态,内部状态和外部状态,内部状态就是各个单个实例所共同一致的部分,也是共享的部分,还有就是外部状态,这个外部状态正是各个原本“实例”不能共享的部分,作为一个外部参数传给共享元工厂的获取方法,以返回一个共享元,这个共享元包含了内部已经定义的好的共享状态,还包括了来自外来参数(环境)指定的“外部状态”。
我理解享元其实表面提供了一种结构,其实本质他提供的是一种操作。在调研过程中有一个距离非常好,就是缓冲池,我们通过工厂模式返回的是一个连接对象,我们本质并不是获得连接对象,其实我们本质获得的是连接对象里面的访问数据库的操作(Open,ExecuteSql…)。对于上面的例子我们通过享元模式返回的并不是一个字体,其实是想要生成字符的方法然后显示字符。
所以享元模式其实它的使用场景是作为节省“为了获取某项操作而实例化”的实例。
其实解释到了缓冲池这个份上,我想这个模式的精髓已经不言而喻了。