设计模式-享元模式

享元模式(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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值