动机
在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价一主要指内存需求方面的代价。
如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?
模式定义
运用共享技术有效地支持大量细粒度的对象
结构类图
案例分析
class Font{
private:
//unique object key
string key;
//object state
//...
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 fongpool[key];
}
else{//若不存在该字,则new出来
Font *font = new Font(key);
fontpool[key] = font;
return font;
}
}
void clear(){
//...
}
}
同一个的字的编码相同,但字体不一定相同,相同编码相同字体用同一个对象,若容器没找到,则new一个新对象加入容器。
要点总结
- Flyweight主要解决面对对象的代价问题,一般不触及面对对象的抽象性问题。
- Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理,一般只能用在只读对象上。
以上内容来源于李建忠老师的c++设计模式