[设计模式]享元模式(Flyweight)
2013-03-11 19:26
387 查看
1.意图
运用共享技术有效地支持大量细粒度的对象。2.动机
有些应用程序在其整个设计过程中采用对象技术,但简单化的实现代价极大。例如,Python等程序中字符串是一个对象。如下面的程序所示,a和b共享了同一个字符串。
>>> a="Hello World" >>> b="Hello World" >>> id(a) 14407008 >>> id(a) 14407008
有比如文档编辑器中的文字,五子棋和围棋中的棋子。棋子的大小和颜色等可以贡献,而位置是不贡献的。这里就引出了一个概念:内部状态与外部状态。在享元对象内部并且不会随环境改变而改变的共享部分,可以成为享元对象的内部状态,而随环境改变而改变的、不可共享的状态就是外部状态。
3.结构与参与者
4.适用性
享元模式的有效性很大程度上取决于如何使用它以及在何处使用它。当一下情况都成立时使用Flyweight模式:1)一个应用程序使用了大量的对象。
2)完全由于使用大量的对象,造成很大的存储开销。
3)对象的大多数状态都可变为外部状态。
4)如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
5)应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
5.效果
使用享元模式的时候,传输、查找或计算外部状态都会产生运行时开销,尤其当享元原先被存储为内部状态时。然而空间上的节省抵消了这些开下。共享的享元越多,空间节省也就越大。6.实现
7.代码示例
#include <iostream> #include <string> #include <vector> using namespace std; //抽象的网站 class WebSite { public: virtual void Use()=0; }; //具体的共享网站 class ConcreteWebSite : public WebSite { private: string name; public: ConcreteWebSite(string strName) { name = strName; } virtual void Use() { cout<<"网站分类:"<<name<<endl; } }; //不共享的网站 class UnShareWebSite : public WebSite { private: string name; public: UnShareWebSite(string strName) { name = strName; } virtual void Use() { cout<<"不共享的网站:"<<name<<endl; } }; //网站工厂类,用于存放共享的WebSite对象 class WebFactory { private: vector<WebSite*> websites; public: WebSite* GetWeb() { vector<WebSite*>::iterator p = websites.begin(); return *p; } WebFactory() { websites.push_back(new ConcreteWebSite("测试")); } }; //客户端 int main() { WebFactory* f= new WebFactory(); WebSite* ws= f->GetWeb(); ws->Use(); WebSite* ws2 = f->GetWeb(); ws2->Use(); //不共享的类 WebSite* ws3 = new UnShareWebSite("测试"); ws3->Use(); return 0; }
相关文章推荐
- [导入]C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式).zip(7.86 MB)
- 设计模式(十)享元模式Flyweight(结构型)
- Java设计模式之共享模式/享元模式(Flyweight模式)介绍
- 设计模式十四(享元模式flyweight,python语言实现)
- 【设计模式】享元模式(Flyweight)
- [设计模式]Flyweight享元模式
- 设计模式(十)享元模式Flyweight(结构型)
- 设计模式:享元模式-flyweight
- 设计模式之Flyweight享元模式
- GOF 23设计模式之 享元模式(FlyWeight)
- [设计模式]享元模式(Flyweight) 共享池 连接池
- Java设计模式之结构型模式-享元模式(Flyweight)
- 设计模式之享元模式(Flyweight)
- JAVA设计模式(08):结构型-享元模式(Flyweight)
- 设计模式 享元模式(Flyweight)
- 23种设计模式之享元模式(FlyWeight)
- Java开发中的23种设计模式之十二:享元模式(Flyweight)
- 设计模式(十)享元模式Flyweight(结构型)
- 设计模式与泡mm的关系之flyweight享元模式及享元模式的再思考
- 步步为营 .NET 设计模式学习笔记 十七、Flyweight(享元模式)