享元模式(Flyweight):运用共享技术有效地支持大量细粒度对象。
享元对象内部不会随环境变化而改变的共享部分,称为享元对象的内部状态,而随环境改变的状态就是外部状态。
在程序设计中,有时候需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本都是相同的,可以把那些参数移到类外,在方法调用时将它们传进来,有时就能大幅度减少需要实例化的类的数量。
比如:要为用户做如产品展示,博客等一些网站,同种类网站只有很小的区别,就不需要为每个用户都搭建一个网站。这里用户就是外部状态,网站就是内部状态。、
UML:
//用户类
class User {
private:
string m_name;
public:
User(string name):m_name(name){}
string Getname()
{
return m_name;
}
};
//抽象网站类
class WebSite {
public:
virtual void SetUser(User *user) = 0;
};
//具体网站类
class ConcreteWebSite :public WebSite {
private:
string m_name;
public:
ConcreteWebSite(string name):m_name(name){}
void SetUser(User *user)
{
cout << "网站分类:" << m_name << " 网站用户:" << user->Getname() << endl;
}
};
//网站工厂类
class WebSiteFactory {
private:
unordered_map<string,ConcreteWebSite*> map; //使用map来保存网站实例,保证一种网站只生成一个实例
public:
WebSite* GetWebSiteCategory(string key)
{
//if (map.find(key) == map.end())
map.insert(make_pair(key, new ConcreteWebSite(key)));
return ((WebSite*)map[key]);
}
int GetWebSiteCount()
{
return map.size();
}
};
int main()
{
WebSiteFactory *f = new WebSiteFactory();
User *user1 = new User("A");
User *user2 = new User("B");
User *user3 = new User("C");
WebSite *w1 = f->GetWebSiteCategory("产品展示");
w1->SetUser(user1);
WebSite *w2 = f->GetWebSiteCategory("产品展示");
w2->SetUser(user2);
WebSite *w3 = f->GetWebSiteCategory("博客");
w3->SetUser(user3);
cout << f->GetWebSiteCount() << endl;
system("pause");
return 0;
}