享元模式

  • 动机
    • 在软件系统采用纯粹对象方案的问题在于大量细颗粒度对象充斥在系统中,从而带来很高的运行时代价
      • — 主要指 内存需求 方面的代价
  • 模式定义
    • 运用 共享技术 有效的支持大量细颗粒度的对象

只读的方式来处理最好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Font{
private:
//unique object key
string key;
//pbject state
//......

public:
Font(const string& key){
//......
}
}
class FontFactory{
private:
map<string,Font*> fontPool;

public:
Font* GetFont(const string&key){
auto item = fontPool,find(key);
if(item!=fontPool.end()){
return fontPool[key];
}else{
Font* font = new Font(key);
fontPool[key] = font;
return font;
}
}
void clear(){}
}

UML图

享元模式UML图

要点总结

  • 面向对象很好的解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。FlyWeight 主要解决面向对象的代价问题。一般不触及面向对象的抽象性问题
  • Flyweight 采用对象共享的做法来降低系统中对象的个数,从而降低细颗粒度对象给系统带来的内存压力。再具体实现方面,要注意对象状态的处理 (只读的最好)
  • 对象的数量太大从而导致对象内存开销加大—什么样的数量才算大?我们需要仔细的根据具体应用情况进行评估,不能凭空臆断