为什么需要享元模式
在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价---主要指内存需要方面的代价。
什么是享元模式
运用共享技术有效地支持大量细粒度的对象。
类图
示例
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!=footPool.end()){
return fontPool[key];
}
else{
Font* font = new Font(key);
fontPool[key]= font;
return font;
}
}
void clear(){
//...
}
};
特点
面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
享元模式采用对象共享做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。具体实现方面,要注意对象状态的处理。