设计模式之享元模式(C++)--共同学习
/***************************************************
享元模式(flyweight):运用共享技术有效地支持大量细
粒度的对象。
***************************************************/
#include <iostream>
#include <string>
using namespace std;
class User
{
private:
string name;
public:
User(string s)
{
name = s;
}
string GetName()
{
return name;
}
};
class WebSite
{
public:
virtual void Use(User* pUser) = 0;
};
class ConcreteWebsite:public WebSite
{
private:
string name;
public:
ConcreteWebsite(string s)
{
name = s;
}
virtual ~ConcreteWebsite()
{
}
string GetName()
{
return name;
}
void Use(User* pUser)
{
cout<<"Web name:"<<name<<", User name:"<<pUser->GetName()<<endl;
}
};
#define MAX_WEBSITE_NUM 10
class WebsiteFactory
{
private:
ConcreteWebsite* WebFactory[MAX_WEBSITE_NUM];
int count;
public:
WebsiteFactory()
{
count = 0;
for(int i=0;i<MAX_WEBSITE_NUM;i++)
{
WebFactory[i] = NULL;
}
}
~WebsiteFactory()
{
for(int i=0;i<MAX_WEBSITE_NUM;i++)
{
if(WebFactory[i])
delete WebFactory[i];
}
}
WebSite* GetWebsite(string name)
{
int i;
for(i=0;i<MAX_WEBSITE_NUM;i++)
{
if(WebFactory[i])
{
if(WebFactory[i]->GetName() == name)
break;
}
}
if(MAX_WEBSITE_NUM == i)
{
if(MAX_WEBSITE_NUM == count)
return NULL;
i = count;
WebFactory[count++] = new ConcreteWebsite(name);
}
return WebFactory[i];
}
int GetCount()
{
return count;
}
};
int main()
{
WebsiteFactory* pWebFac = new WebsiteFactory();
User* pUser = NULL;
WebSite *pWeb1 = pWebFac->GetWebsite("Blog");
pUser = new User("Adam");
pWeb1->Use(pUser);
delete pUser;
WebSite *pWeb2 = pWebFac->GetWebsite("Show");
pUser = new User("Blue");
pWeb2->Use(pUser);
delete pUser;
WebSite *pWeb3 = pWebFac->GetWebsite("Blog");
pUser = new User("color");
pWeb3->Use(pUser);
delete pUser;
WebSite *pWeb4 = pWebFac->GetWebsite("Blog");
pUser = new User("dog");
pWeb4->Use(pUser);
delete pUser;
cout<<"Total website num is "<<pWebFac->GetCount();
delete pWebFac;
return 0;
}
用MinGW编译,输入结果:
Web name:Blog, User name:Adam
Web name:Show, User name:Blue
Web name:Blog, User name:color
Web name:Blog, User name:dog
Total website num is 2
Terminated with return code 0
Press any key to continue ...