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. 解决ubuntukylin 13.10安装wine时无法解决软件包依赖问题

    在ubuntukylin 13.10中,无论是在软件中心安装wine还是通过apt-get install安装wine都会出现软件包依赖问题且无法解决. 问题重现 在软件中心安装wine报错例如以下: ...

  2. 【Cocos2dX(2.x)_Lua开发之三】

    [Cocos2dX(2.x)_Lua开发之三]在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解 本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明 ...

  3. java中已经排序的列表中插入新值

    static List<Integer> insertSortedList(){ List<Integer> nums = new ArrayList<Integer&g ...

  4. root 执行过程权限问题

    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法 权限问题,授权 给 root  所有sql ...

  5. 使用javac,手动编译一个java文件的方法

    参考<Tomcat与Java Web开发技术详解>中的命令: javac -classpath c:\tomcat\lib\servlet-api.jar                  ...

  6. java实体类如果不重写toString方法,会如何?

    先认识一下Object Object 类的 toString 方法 返回一个字符串,该字符串由类名(对象是该类的一个实例).at 标记符“@”和此对象哈希码的无符号十六进制表示组成.换句话说,该方法返 ...

  7. tornado+ansible+twisted+mongodb运维自己主动化系统开发(四)

    这周好忙,依据之前的写了个简陋的demo.放在腾讯的云主机上了,大家多交流哈 demo地址 http://203.195.193.251/

  8. ASP.NET动态网站制作(23)-- ADO.NET(2)

    前言:这节课老师请高级班的E老师过来代课,还是接着老师讲的内容继续深入,修改了上节课老师写的部分代码. 内容: 1.数据库本质就是一个软件,这个软件帮助我们把数据有序地存储起来,当我们需要数据的时候帮 ...

  9. 安装PyTorch 0.4.0

    https://blog.csdn.net/sunqiande88/article/details/80085569 https://blog.csdn.net/xiangxianghehe/arti ...

  10. python 函数的进阶

    1. 动态参数 位置参数的动态参数: *args 动态接收参数的时候要注意: 动态参数必须在位置参数后面 顺序: 位置参数, 动态参数*, 默认值参数 例子: def chi(a, b, *food, ...