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

大话设计模式--享元模式 Flyweight -- C++实现实例的更多相关文章

  1. 设计模式-享元模式(FlyWeight)

    一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...

  2. 设计模式--享元模式Flyweight(结构型)

    一.享元模式 在一个系统中如果有多个相同的对象,这些对象有部分状态是可以共享的,我们运用共享技术就能有效地支持大量细粒度的对象. 二.例子 举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子. ...

  3. 深入浅出设计模式——享元模式(Flyweight Pattern)

    模式动机 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.享元模式正是为解决这一类问题而诞生 ...

  4. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  5. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  6. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  7. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  8. 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

随机推荐

  1. BMP图片的C++水印算法

    http://wenku.baidu.com/link?url=aVenUhViH9f6At4Lj_As7Rzp_eJWXTcmbUTH0qazd1Y1ZYiU3i1j0pM3G0r_PViIecsv ...

  2. .net之Ajax获取接口数据并实现循环播放

    <script type="text/javascript"> var xhr; ; var res; window.onload = function () { xh ...

  3. ACE_Svc_Handler 通信原理

    ACE作为通讯方面的开源架构,不但用c++实现,而且用JAVA实作的架构已经可以使用了,由此看来掌握ACE成为每歌开发通讯程序的程序员的必备技能. ACE的库分为4个层次: OS适配层该层将ACE的较 ...

  4. maven 依赖文件 pom.xml 编译 mvn compile 运行 不用mvn exec:java -Dexec.mainClass="hello.HelloWorld" 打成jar包 mvn package mvn install http://blog.csdn.net/yaya1943/article/details/48464371

    使用maven编译Java项目 http://blog.csdn.net/yaya1943/article/details/48464371  使用"mvn clean"命令清除编 ...

  5. rsync的介绍及参数详解,配置步骤,工作模式介绍

    rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...

  6. JSP 连接数据库JDBC有一定的了解

    JSP 连接数据库 本章节假设您已经对JDBC有一定的了解.在开始学习JSP数据库访问前,请确保JDBC环境已经正确配置. 首先,让我们按照下面的步骤来创建一个简单的表并插入几条简单的记录: 创建表 ...

  7. Pexpect--example--hive.py解读

    python version 2.6.6 ; pexpect 2.3 login方法解读: def login (args, cli_username=None, cli_password=None) ...

  8. 动态创建Lambda表达式实现高级查询

    需求简介 最近这几天做的东西总算是回归咱的老本行了,给投资管理项目做一个台账的东西,就是类似我们的报表.其 中有一个功能是一个高级查询的需求,在查询条件方面大概有7.8个查询条件.需求就是如果一个条件 ...

  9. 使用CSDN CODE来存放OPENSTACK位于GITHUB上的源代码

    use CSDN CODE to pull openstack codes 2014-11-20 Author:Hyphen 问题 直接从GITHUB上获代替码,常常是没保障,特别是用DEVSTACK ...

  10. Android hellocharts 柱形图详解

    近日需要做图表结构的项目,目前最火的就是hellocharts  和MPAndroidChart  相对来说hellocharts集成比较简单: 官网地址   https://github.com/l ...