大话设计模式--享元模式 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")); }