享元模式(Flyweight Pattern)
在软件系统中采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价,------主要指内存需求方面的代价
运用共享技术有效地支持大量细粒度的对象 -----《设计模式》GoF
意图
采用共享方式有效使用数量巨大的细粒度对象
应用场景:
1. 减少对象实例数量、
2. 共享实例以提高资源利用或性能
影响:
1. 享元对象的外在状态的计算需要花费运行时
代码:
class Font {
private:
//unique object key
string key;
public:
Font(const string& key) {
}
};
class FontFactory {
private:
map<string, Font*> fontPool;
public:
Font* getFont(const string& key) {
map<string, Font*>::iterator item = fontPool.find(key);
if( item != fontPool.end()){
return fontPool[key];
}
else {
Font* font = new Font(key);
fontPool[key] = font;
return font;
}
}
void clear() {
}
};
Font字体类 ,如果频繁使用该类 ,建立一个Pool (线程池之类的原理相同),如果存在相同类型的 ,就返回 ,没有就创建。
总结:
- 面向对象很好地解决了抽象性问题 , 但作为一个运行在机器中的程序实体,
我们需要考虑对象的代价问题 。 Flyweight主要解决面向对象的代价问题,一般不触及
面向对象的抽象性问题 - Flyweight采用对象共享的做法降低系统中对象的个数,从而降低第粒度对象给系统
带来的内存压力。在具体方面,要注意对象状态的处理 - 对象的数量太大从而导致对象内存开销加大 —什么样的数量才能算大。这需要我们仔细
的根据具体情况进行评估,而不能凭空臆断。