定义
运用共享技术有效的支持大量细粒度的对象。
案例
Flyweight模式对那些通常因为数量太大而难以用对象来表示的概念或实体进行建模。比如要设计一个文档编辑器,就要处理很多的字符对象,如果为每一个字符都创建一个对象来管理,那代价是昂贵的。当输入一个“Hello”字符串的时候,可以看出有两个'l',这时候可以使用享元模式,只创建一个'l'字符,每一个用到的地方指向同一个字符对象。
然后再给这些对象加一些外部信息,如字体、大小等,在每次要使用字符的时候都通过FlyweightFactory获取:
class FlyweightFactory {
public:
Character* createCharacter(char);
private:
Character* character[NCHARCODES];
}
Character* FlyweightFactory::createCharacter(char c) {
if(!character[c])
character[c] = new Character(c);
return character[c];
}
适用性
- 一个应用使用了大量的对象
- 由于使用了大量对象,对系统造成了存储开销
- 对象的大多数状态都是外部状态
- 应用程序不依赖对象标识
相关模式
一般和组建模式联合起来使用,用共享叶结点的有向无环图实现一个逻辑上的层次结构。