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

最新文章

  1. dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
  2. Lesson 9 A cold welcome
  3. 解决某些Android Permission denied
  4. 深入分析ClassLoader
  5. CSS3的@keyframes用法详解:
  6. 控制台telnet连接后无法关闭
  7. 2016春招Android开发实习生(网易传媒)笔试
  8. mysql配置mysql-proxy读写分离
  9. 同一个解决方案&quot;引用&quot;其他的项目出现感叹号...
  10. 在SQL里如何写条件逻辑?
  11. 中文Ubuntu系统根目录文件夹名称变为英文
  12. IIC 概述之3
  13. 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。
  14. (转)SWT的CheckBoxTreeViewer的相关用法
  15. ORACLE NLS_DATE_FORMAT设置
  16. Linux 桌面玩家指南:15. 深度学习可以这样玩
  17. php 随机生成数字字母组合
  18. python 的类装饰器
  19. 微信 weui 初体验
  20. json-lib 的maven dependency

热门文章

  1. Android遇到的那些坑
  2. shiro集成encache
  3. Unity中surfaceShader的处理机制和finalColor
  4. Python闲谈(二)聊聊最小二乘法以及leastsq函数
  5. Collect More Jewels(hdu1044)(BFS+DFS)
  6. [原创]实现多层DIV叠加的js事件穿透
  7. 【题解】POJ2279 Mr.Young′s Picture Permutations dp
  8. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
  9. Failed to decode response: zlib_decode(): data error Retrying with degraded;
  10. Onenet GPS上传经纬度的格式 笔记