天天看點

設計模式之——享元模式

website.h

#ifndef WEBSITE_H
#define WEBSITE_H

#include <QString>
#include <QtDebug>

class WebSite
{
public:
    WebSite() {}
    virtual void use() = 0;
};

class ConcreteWebSite : public WebSite
{
public:
    ConcreteWebSite(QString name)
    {
        m_name = name;
    }

    void use()
    {
        qDebug() << "網站分類: " << m_name;
    }

private:
    QString m_name;
};

#endif // WEBSITE_H

           

WebSiteFactory.h

#ifndef WEBSITEFACTORY_H
#define WEBSITEFACTORY_H

#include <QStringList>
#include <QMap>
#include "website.h"


class WebSiteFactory
{
public:
    WebSiteFactory() {}

    WebSite *getWebSiteCategory(QString key)
    {
        if(!m_flyweights.contains(key))
        {
            ConcreteWebSite *con = new ConcreteWebSite(key);
            m_flyweights.insert(key,con);
        }
        QMap<QString,ConcreteWebSite*>::iterator ite = m_flyweights.find(key);

        return ite.value();
    }

    int getWebSiteCount()
    {
        return m_flyweights.count();
    }


private:
    QMap<QString,ConcreteWebSite*> m_flyweights;
};

#endif // WEBSITEFACTORY_H
           

main.cpp

#include <QApplication>
#include "WebSiteFactory.h"
#include "website.h"

//享元模式
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    WebSiteFactory *f = new WebSiteFactory();
    WebSite *fx = f->getWebSiteCategory("部落格");
    fx->use();

    fx = f->getWebSiteCategory("部落格");
    fx->use();

    fx = f->getWebSiteCategory("産品展示");
    fx->use();

    qDebug() << "網站數量:" << f->getWebSiteCount();

    return a.exec();
}
           

輸出結果

網站分類:  "部落格" 
網站分類:  "部落格" 
網站分類:  "産品展示" 
網站數量: 2 
           

享元模式,對同類别隻建立一個執行個體。

UML

設計模式之——享元模式

繼續閱讀