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. jquery validate 详解

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一导入js库 <script src=&qu ...

  2. An internal error occurred during: &quot;J2EE Component Mapping Update&quot;.

    1.错误描写叙述 An internal error occurred during: "J2EE Component Mapping Update". java.lang.Nul ...

  3. HDFS源码分析之FSImage文件内容(一)总体格式

    FSImage文件是HDFS中名字节点NameNode上文件/目录元数据在特定某一时刻的持久化存储文件.它的作用不言而喻,在HA出现之前,NameNode因为各种原因宕机后,若要恢复或在其他机器上重启 ...

  4. UVA 10131题解

    第一次写动态规划的代码,整了一天,终于AC. 题目: Question 1: Is Bigger Smarter? The Problem Some people think that the big ...

  5. centos7设置ip

    centos7不能再通过setup命令来设置ip了,但可以通过修改网卡配置文件来设置ip 在/etc/sysconfig/network-scripts目录下找到网卡配置文件,修改之前内容如下 TYP ...

  6. 【Mac系统 + Python + Django】之搭建第一个【Django Demo(一)】

    我编写的此系列学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学 ...

  7. 【Python + selenium】之BSTestRunner:NameError: name 'unicode' is not defined

    参考文章:<python3.6 :NameError: name 'unicode' is not defined>

  8. jquery get ($.get) 事件用法与分析

    jquery get ($.get) 事件用法与分析 get() 方法通过远程 HTTP GET 请求载入信息.这是一个简单的 GET 请求功能以取代复杂 $.ajax .请求成功时可调用回调函数.如 ...

  9. PopupWindowFromBottom 从底部弹出popupwindow

    自定义PopupWindowFromBottom public class PopupWindowFromBottom extends PopupWindow { public PopupWindow ...

  10. centos7.0 安转mysql5.7

    安装mysql5.7需要boost依赖包groupadd mysql useradd -r -g mysql -s /bin/false mysql cmake . -DCMAKE_INSTALL_P ...