设计模式---享元模式

来源:互联网 发布:python range转换list 编辑:程序博客网 时间:2024/05/20 02:51
享元模式
运用共享技术有效地支持大量细粒度的对象。

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

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



#include<iostream>
#include<map>

using namespace std;


class User
{
    private:
        string name;
    public:
        User(string name)
        {
            this->name = name;
        }
        string getName()
        {
            return name;
        }
};

class WebSite
{
    public:
        virtual void Use(User *user){}
};

class ConcreteWebSite:public WebSite
{
    private:
        string name;
    public:
        ConcreteWebSite(string name)
        {
            this->name = name;
        }
        void Use(User *user)
        {
            cout<<"website : "<<name<<"user name: "<<user->getName()<<endl;
        }
};

class WebSiteFactory
{
    private:
        map<string,WebSite*>m_flyweights;
    public:
        WebSite * GetWebSiteCategory(string key)
        {
            if((m_flyweights.find(key))->second == NULL )
            {
                m_flyweights.insert(pair<string,ConcreteWebSite*>(key,new ConcreteWebSite(key)));

            }
            return (WebSite *)m_flyweights[key];
        }

        int GetWebSiteCount()
        {
            return m_flyweights.size();
        }
};

int main()
{
    WebSiteFactory *f = new WebSiteFactory();

    WebSite *fx = f->GetWebSiteCategory("produce display ");
    fx->Use(new User("xiao ming"));

    WebSite *fy = f->GetWebSiteCategory("produce display ");
    fy->Use(new User("hong ming"));

    WebSite *fz = f->GetWebSiteCategory("produce display ");
    fz->Use(new User("zhang ming"));
    
    WebSite *f1 = f->GetWebSiteCategory("bolg display ");
    f1->Use(new User("lili"));
    
    WebSite *f2 = f->GetWebSiteCategory("bolg display ");
    f2->Use(new User("hehe"));
    
    WebSite *f3 = f->GetWebSiteCategory("bolg display ");
    f3->Use(new User("enen"));

    cout<<"count="<<f->GetWebSiteCount()<<endl;
    
    return 0;
}


原创粉丝点击