天天看点

Aha!设计模式(66)-享元模式(3)

示例代码

以下为享元模式的Python语言实现,代码为作者本人提供。如果稍加调查,应该可以发现其他的实现方式,但本文中的代码以尽量靠近《设计模式》的方式提供,首先是Flyweight相关类:

Aha!设计模式(66)-享元模式(3)

Flyweight主要是定义了一个适用外部状态的operation方法,接下来ConcreteFlyweight具体实现了这个方法,代码中将外部状态叠加在对象的输出上;另外一个UnsharedConcreteFlyweight是非共享具象类,它的输出只输出对象自身的状态。

如果只到这一步的话,和享元并没有太大的关系,接下来是关键:

Aha!设计模式(66)-享元模式(3)

一个对象是否在使用者之间共享是由FlyweightFactory决定的,对于需要共享的ConcreteFlyweight对象,工厂类维护了一个对象池,如果需要的对象已经存在,则直接返回该对象。如果需要的对象不存在,则创建一个对象保存在对象池中以后再返回;对于不需要功能的UnsharedConcreteFlyweight对象,直接构建新对象并返回。代码中直接适用state作为享元对象分类的依据,实际的开发中可以根据需要决定。

以下是适用享元的代码:

Aha!设计模式(66)-享元模式(3)

代码中为每个对象赋予了不同的外部状态。接下来是程序输出:

Aha!设计模式(66)-享元模式(3)

前两个输出来自于同一个对象,但是输出不同的外部状态,后面三个输出分别来自不同的对象。

效果

使用享元模式可以节约不同使用者持有相同数据时造成的内存空间浪费,这种对象越多,效果越明显。但是需要注意的是,管理外部状态也需要执行时间和内存空间的代价,在实际使用的时候需要计算得失之后再决定。

另外一种情况是由于软件的需求在使用者之间共享对象,这时享元模式可以作为实现方式的一个可选项。当然了,这种情况下效率和空间就不是第一位的因素了。

继续阅读