大话设计模式--享元模式 Flyweight -- C++实现实例

1. 享元模式: 运用共享技术有效地支持大量细粒度的对象。

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

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

 

实例: (例子中 对象实例实际只有两个)

website.h website.cpp

#ifndef WEBSITE_H
#define WEBSITE_H

#include "user.h"

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

#endif // WEBSITE_H
#include "website.h"

WebSite::WebSite()
{
}

 

concretewebsite.h concretewebsite.cpp

#ifndef CONCRETEWEBSITE_H
#define CONCRETEWEBSITE_H

#include "website.h"
#include <QString>

class ConcreteWebSite : public WebSite
{
public:
    ConcreteWebSite(QString type);
    void use(User *user);

private:
    QString type;

};

#endif // CONCRETEWEBSITE_H
#include "concretewebsite.h"
#include <QDebug>

ConcreteWebSite::ConcreteWebSite(QString type)
{
    this->type = type;
}

void ConcreteWebSite::use(User *user)
{
    qDebug() << "WebType: " << type << " User: " << user->getName();
}


user.h user.cpp

#ifndef USER_H
#define USER_H

#include <QString>

class User
{
public:
    User(QString name);
    QString getName();

private:
    QString name;
};

#endif // USER_H
#include "user.h"

User::User(QString name)
{
    this->name = name;
}

QString User::getName()
{
    return this->name;
}

 

websitefactory.h websitefactory.cpp

#ifndef WEBSITEFACTORY_H
#define WEBSITEFACTORY_H

#include <QMap>
#include <QString>
#include "concretewebsite.h"

class WebSiteFactory
{
public:
    WebSiteFactory();
    WebSite* getWebSiteCategory(QString type);
    int getWebCount();

private:
    QMap<QString, WebSite*> *webMap;

};

#endif // WEBSITEFACTORY_H
#include "websitefactory.h"

WebSiteFactory::WebSiteFactory()
{
    webMap = new QMap<QString, WebSite*>();
}

WebSite* WebSiteFactory::getWebSiteCategory(QString type)
{
    if(webMap->value(type)==NULL)
        webMap->insert(type, new ConcreteWebSite(type));
    return webMap->value(type);
}

int WebSiteFactory::getWebCount()
{
    return webMap->count();
}

 

main.cpp

#include <QCoreApplication>
#include "websitefactory.h"

int main(int argc, char *argv[])
{
    WebSiteFactory f;
    WebSite *fx = f.getWebSiteCategory("show");
    fx->use(new User("xiaoming"));

    WebSite *fy = f.getWebSiteCategory("show");
    fy->use(new User("lisi"));

    WebSite *fz = f.getWebSiteCategory("show");
    fz->use(new User("zhangsan"));

    WebSite *ffx = f.getWebSiteCategory("blog");
    ffx->use(new User("xiaoming"));

    WebSite *ffy = f.getWebSiteCategory("blog");
    ffy->use(new User("lisi"));

    WebSite *ffz = f.getWebSiteCategory("blog");
    ffz->use(new User("zhangsan"));
}


 

 

 

posted @ 2013-10-18 11:45  今晚打酱油_  阅读(266)  评论(0编辑  收藏  举报