大话设计模式--享元模式 Flyweight -- C++实现实例
2024-09-03 12:26:33
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"));
}
最新文章
- dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
- Lesson 9 A cold welcome
- 解决某些Android Permission denied
- 深入分析ClassLoader
- CSS3的@keyframes用法详解:
- 控制台telnet连接后无法关闭
- 2016春招Android开发实习生(网易传媒)笔试
- mysql配置mysql-proxy读写分离
- 同一个解决方案";引用";其他的项目出现感叹号...
- 在SQL里如何写条件逻辑?
- 中文Ubuntu系统根目录文件夹名称变为英文
- IIC 概述之3
- 如何在WindowsPhone Bing Map控件中显示必应中国中文地图、谷歌中国中文地图。
- (转)SWT的CheckBoxTreeViewer的相关用法
- ORACLE NLS_DATE_FORMAT设置
- Linux 桌面玩家指南:15. 深度学习可以这样玩
- php 随机生成数字字母组合
- python 的类装饰器
- 微信 weui 初体验
- json-lib 的maven dependency
热门文章
- Android遇到的那些坑
- shiro集成encache
- Unity中surfaceShader的处理机制和finalColor
- Python闲谈(二)聊聊最小二乘法以及leastsq函数
- Collect More Jewels(hdu1044)(BFS+DFS)
- [原创]实现多层DIV叠加的js事件穿透
- 【题解】POJ2279 Mr.Young′s Picture Permutations dp
- 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
- Failed to decode response: zlib_decode(): data error Retrying with degraded;
- Onenet GPS上传经纬度的格式 笔记