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

来源:互联网 发布:接收手机短信的软件 编辑:程序博客网 时间:2024/06/05 21:04

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"));}