设计模式【十一】:享元模式
伪代码
class SharedComponent{
public:
SharedComponent(string key);
}
class UnsharedComponent{
}
class SharedComponentFactory{
public:
SharedComponent getSharedComponent(String key){
SharedComponent res = _pool.get(key);
if(res == NULL){
res = new SharedComponent(key);
_pool.put(key, res);
}
return res;
}
private:
HashTable<SharedComponent> _pool;
}
class Product{
public:
setSharedComponent(String key, SharedComponentFactory& factory){
_sharedComponent = factory.getSharedComponent(key);
}
private:
SharedComponent _sharedComponent;
UnsharedComponent _unSharedComponent;
}
优缺点
优点
缺点
何时使用
- 使用大量对象,
- 且空间消耗纯粹因为对象的数量而巨大,
- 且对象的大多数状态是可被分离的,
- 且不要求识别两个对象是否为同一对象
实现时技巧
- 考虑将对象的多大一部分设计为享元。举个例子,如果有三个对象,将每个对象的全部设计为一个享元,那么我们需要三个享元,实际上并没有节省空间。再比如有三个对象分别构成为abc, abd, ad.我们可以把ab设为享元,也可以把a设为享元,也可以把ad设为享元。总之,这是一个需要考虑乃至计算的问题。
- 为方便享元的管理,调用者一般不能直接new享元,应该通过工厂去生产以及管理。