设计模式之11 - 享元模式FlyWeight
2017-01-13 20:17
441 查看
享元模式 是结构性模式中一种非常有用的模式,其特点在于 复用内存中已存在的对象,从而降低创建对象的开销。
这在系统中存在大量的 细粒度对象的情况下非常有用,比如 一篇英文文稿,里面的词成千上万,但是对应的英文字符只有26个,再加上10个数字,不考虑标点和其它特殊字符的情况下,只有36个对象。
这就是 享元,共享的元素。
对于上面的例子,内存中只需要创建36个元素,这些元素在页面的绘制只是大小和位置不同。
针对上面的word绘制实例,来看一段代码实现:
[b]享元模式 需要将享元对象的状态外部化(上面例子中的FontSize),外部状态的读取会使得运行时间变长。
享元模式 在一般的开发中并不常用,常常应用于系统底层的开发,以便解决系统的性能问题,以下情况成立时可以使用Flyweight模式。
1)一个应用程序使用了大量的对象。
2)由于使用大量的对象,造成很大的存储开销。
3)对象的大多数状态都可变为外部状态。
4)如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
5)应用程序不依赖对象标识。
这在系统中存在大量的 细粒度对象的情况下非常有用,比如 一篇英文文稿,里面的词成千上万,但是对应的英文字符只有26个,再加上10个数字,不考虑标点和其它特殊字符的情况下,只有36个对象。
这就是 享元,共享的元素。
对于上面的例子,内存中只需要创建36个元素,这些元素在页面的绘制只是大小和位置不同。
针对上面的word绘制实例,来看一段代码实现:
// 抽象字符类 class CharBase { public: // 绘制 virtual void draw(); protected: // 属性 char m_letter; int m_nFontSize; }; // 具体字符类A class CharA : public CharBase { // 构造函数 CharA() { this->m_letter= 'A'; this->m_nFontSize= 12; } // 绘制 virtual void draw() { } }; // 具体字符类B class CharB : public CharBase { // 构造函数 CharB() { this->m_letter= 'B'; this->m_nFontSize= 12; } // 绘制 virtual void draw() { } };从面相对象的角度,这种方式看上去很合理,但实际上就产生了大量的内存对象,每个字符都要保存Font属性,并绘制一遍,在这里就变得极不合理。明智的做法是 从一个共享池中获取,也就是对应类图中的 FlyweightFactory(下面例子中的 CharFactory)。
class CharFactory { // 构造函数 CharFactory() { m_Chars[A] = new CharA(); m_Chars = new CharB(); } // 获得指定字符实例 CharBase* getChar(string& key) { map<string,CharBase*>::iterator ite = (CharBase*)m_Chars.find(key); if( ite == m_Chars.end() ) { CharBase* pChar = NULL; if("A"==key) pChar = new CharA(); else if("B"==key) pChar = new CharB(); m_Chars[key] = pChar; } return pChar; } protected: map<string,CharBase*> m_Chars; };
[b]享元模式 需要将享元对象的状态外部化(上面例子中的FontSize),外部状态的读取会使得运行时间变长。
享元模式 在一般的开发中并不常用,常常应用于系统底层的开发,以便解决系统的性能问题,以下情况成立时可以使用Flyweight模式。
1)一个应用程序使用了大量的对象。
2)由于使用大量的对象,造成很大的存储开销。
3)对象的大多数状态都可变为外部状态。
4)如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
5)应用程序不依赖对象标识。
相关文章推荐
- 设计模式(11)--Flyweight(享元模式)--结构型
- 设计模式(11)-结构型-享元模式(Flyweight)
- 【设计模式 - 11】之享元模式(FlyWeight)
- [设计模式] 11 享元模式 Flyweight
- 【设计模式 - 11】之享元模式(FlyWeight)
- 设计模式——享元模式(Flyweight)
- 设计模式学习笔记--Flyweight享元模式
- 重温设计模式(一)——享元模式(Flyweight)
- 设计模式(11)-单例模式(Flyweight)
- 一天一个设计模式之享元模式(flyweight)
- 设计模式之享元模式(Flyweight)
- 设计模式学习笔记(十二)——Flyweight享元模式
- 设计模式--Flyweight享元模式
- 设计模式学习8 -- Flyweight(享元模式)
- 设计模式学习11 Flyweight
- 重温设计模式(一)——享元模式(Flyweight)
- 设计模式--享元模式(Flyweight)
- 设计模式--享元模式(Flyweight)
- 设计模式与泡mm的关系之flyweight享元模式及享元模式的再思考
- 设计模式学习笔记(十二)——Flyweight享元模式