Flyweight 享元模式
属于对象性能模式,主要考虑面向对象所带来的成本问题。
动机
软件系统采用纯对象方案的问题在于大量细粒度的对象会很快充斥整个系统,从而带来很高的运行时代价。
如何避免大量细粒度对象问题的同时,让外部客户程序依然能够透明地使用面向对象的方式来进行操作?
定义
运行共享技术有效地支持大量细粒度的对象。
示例代码
class Font {
private:
string key;
// ...
public:
Font(const string& key) {
// ...
}
};
class FontFactory {
private:
map<string, Font*> fontPool;
public:
Font* GetFont(const string& key) {
map<string, Font*>::iterator itr = fontPool.find(key);
if(itr != fontPool.end()) {
return fontPool[key];
} else {
Font* font = new Font(key);
fontPool[key] = font;
return font;
}
}
};
我们会有一个数据结构存储现在已经产生的细粒度对象,需要根据关键字来索引,当有相同关键字的对象时,就直接返回。当发现相关 key 对象还没有创建时,则新建对象返回,并将新建的对象加入到存储队列当中,下次查找就会命中。
结构图
总结
- Flyweight 主要考虑的是面向对象的代价问题,一般不涉及到面向对象的抽象性问题
- Flyweight 采用对象共享的做法来降低系统中对象的个数,从而降低面向对象带来的内存压力
其他设计模式汇总:
[设计模式] —— 设计模式的介绍及分类