设计模式:26 项目多也别傻做_享元模式

来源:互联网 发布:python代码大全 编辑:程序博客网 时间:2024/06/05 22:38

享元模式:运用共享技术有效地支持大量细粒度的对象

 

实例:

围棋中,棋子是大量细粒度的对象,有些属性内在的,如颜色,有些属性外在的,比如棋盘上的位置,内在属性是可以共享的。区别在于外在属性。

可以这样设计:只需要定义两个棋子对象,黑棋和白棋,这两个对象含棋子的内在属性;棋子的外在属性,即棋盘上的位置提取出来,存放在单独的容器中。则容器只存放位置属性,而原来则是棋子对象,减少了空间需求。

内部状态:对象内部不会随环境改变而改变的共享部分

外部状态:随环境改变而改变的状态

 

优点:可以避免大量非常相似类的开销。

适用:需要生成大量细粒度的类实例表示数据,若实例除了几个参数外基本都相同的,就能够大幅度减少需要实例化类的数量。如果能把那些参数移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少单个实例的数目。

 

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

 

main.cpp

#include <iostream>#include <stdlib.h>#include <memory>#include "User.h"#include "Website.h"#include "WebsiteFactory.h"void process(){WebsiteFactory websiteFactory;shared_ptr<Website> ptrWebsite1 = websiteFactory.getWebsiteCategory("微博");ptrWebsite1->use(User("马超"));shared_ptr<Website> ptrWebsite2 = websiteFactory.getWebsiteCategory("微博");ptrWebsite1->use(User("马燕"));shared_ptr<Website> ptrWebsite3 = websiteFactory.getWebsiteCategory("博客");ptrWebsite3->use(User("倪清"));shared_ptr<Website> ptrWebsite4 = websiteFactory.getWebsiteCategory("博客");ptrWebsite4->use(User("董飞"));cout << "网站分类总数为:" << websiteFactory.getWebsiteCount() << endl;}int main(int argc,char* argv[]){process();system("pause");return 0;}


User.h

#ifndef USER_H#define USER_H#include <string>using namespace std;class User{public:User(const string& sName);~User(void);public:string _sName;};#endif


User.cpp

#include "User.h"User::User(const string& sName):_sName(sName){}User::~User(void){}


Website.h

#ifndef WEBSITE_H#define WEBSITE_H#include <string>using namespace std;class User;class Website{public:Website(void);virtual ~Website(void);virtual void use(const User& user);};class ConcreteWebsite : public Website{public:ConcreteWebsite(const string& sName);~ConcreteWebsite();void use(const User& user);public:string _sName;};#endif


Website.cpp

#include "Website.h"#include <iostream>#include "User.h"using namespace std;Website::Website(void){}Website::~Website(void){}void Website::use(const User& user){}ConcreteWebsite::ConcreteWebsite(const string& sName):_sName(sName){}ConcreteWebsite::~ConcreteWebsite(){}void ConcreteWebsite::use(const User& user){cout << "网站分类:" << _sName << " 用户:" << user._sName << endl;}


WebsiteFactory.h

#ifndef WEBSITEFACTORY_H#define WEBSITEFACTORY_H#include <unordered_map>#include <string>#include <memory>#include "Website.h"using namespace std;class WebsiteFactory{public:WebsiteFactory(void);~WebsiteFactory(void);shared_ptr<Website> getWebsiteCategory(const string& sKey);int getWebsiteCount();private:unordered_map<string , shared_ptr<Website> > _umapKeyToWebsite;};#endif


WebsiteFactory.cpp

#include "WebsiteFactory.h"#include <iostream>WebsiteFactory::WebsiteFactory(void){}WebsiteFactory::~WebsiteFactory(void){}//根据网站分类shared_ptr<Website> WebsiteFactory::getWebsiteCategory(const string& sKey){//如果未能找到网站,就添加分类if(_umapKeyToWebsite.find(sKey) == _umapKeyToWebsite.end()){shared_ptr<Website> ptrConcreteWebsite(new ConcreteWebsite(sKey));_umapKeyToWebsite.insert(make_pair(sKey , ptrConcreteWebsite));}return _umapKeyToWebsite[sKey];}//获取网站分类总数int WebsiteFactory::getWebsiteCount(){return _umapKeyToWebsite.size();}


 

0 0
原创粉丝点击