(二十二)享元模式

来源:互联网 发布:怎么才能开淘宝店 编辑:程序博客网 时间:2024/05/09 00:30


享元模式(flyweight),运用共享技术有效地支持大量细粒度的对象。【DP】

UML:

源码:

// Flyweight.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>#include <hash_map>using namespace std;//网站class WebSite{public:virtual void Use(string user) = 0;};//具体的网站class ConcreteWebSite : public WebSite{private:string name;public:ConcreteWebSite(string name){this->name = name;}public:void Use(string user){cout << "网站分类:" << name << " 用户:" << user << endl;}};//网站工厂class WebSiteFactory{private:hash_map<string, WebSite*> flyweights;//这里使用了hash_map来存储大量的对象//获得网站分类public:WebSite *GetWebSiteCategory(string key){if (flyweights.end() == flyweights.find(key))flyweights.insert(pair<string, WebSite*>(key, new ConcreteWebSite(key)));return flyweights.find(key)->second;}//获得网站分类总数public:int GetWebSiteCount(){return flyweights.size();}};int _tmain(int argc, _TCHAR* argv[]){WebSiteFactory f;WebSite *fx = f.GetWebSiteCategory("产品展示");fx->Use("小菜");WebSite *fy = f.GetWebSiteCategory("产品展示");fy->Use("大鸟");WebSite *fz = f.GetWebSiteCategory("产品展示");fz->Use("娇娇");WebSite *fl = f.GetWebSiteCategory("博客");fl->Use("老顽童");WebSite *fm = f.GetWebSiteCategory("博客");fm->Use("桃谷六仙");WebSite *fn = f.GetWebSiteCategory("博客");fn->Use("南海鳄神");cout << "得到网站分类总数为 " << f.GetWebSiteCount() << endl;return 0;}


输出:

优点:
1.享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要成大量细粒度的类实力来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有事就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度减少单个实例的数目。

应用场景:
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么就可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

0 0
原创粉丝点击