作用:运用共享技术有效地支持大量细粒度的对象

UML结构图:

解析:

Flyweight模式在大量使用一些可以被共享的对象的时候使用。比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套的话语敷衍别人,如“呵呵”,“好的”等待之类的,这些简单的答复其实每个人都是提前定义好的,在使用的时候才调用起来。

Flyweight就是基于解决这种问题的思路而产生的,当需要一个可以在其他地方共享使用的对象的时候,先去查询是否已经存在了同样的对象,如果没有就生成之;有的话就直接使用。

因此,Flyweight模式和Factory模式也经常混用。

实现:

需要说明的是下面的实现仅仅实现了对可共享对象的使用,非可共享对象的使用没有列出,因为这个不是Flyweight模式的重点。

这里的实现要点就是采用一个list链表来保存这些可以被共享的对象,需要使用的时候就到链表中查询是不是已经存在了,如果不存在就初始化一个,然后返回这个对象的指针。

(1)Flywight.h

  1. #include <string>
  2. #include <list>
  3. typdef std::string STATE;
  4. class Flyweight
  5. {
  6. public:
  7. virtual ~Flyweight(){}
  8. STATE GetInstrinsicState();
  9. virtual void Operation(STATE &ExtrinsicState) = 0;
  10. protected:
  11. Flyweight(const STATE& state):m_State(state)
  12. {
  13. }
  14. private:
  15. STATE m_State;
  16. };
  17. class FlyweightFactory
  18. {
  19. public:
  20. FlyweightFactory(){}
  21. ~FlyweightFactory();
  22. Flyweight* GetFlyweight(const STATE& key);
  23. private:
  24. std::list<Flyweight*> m_listFlyweight;
  25. };
  26. class ConcreateFlyweight : public Flyweight
  27. {
  28. public:
  29. ConcreateFlyweight(const STATE& state) : Flyweight(state)
  30. {
  31. }
  32. virtual ~ConcreateFlyweight(){}
  33. virtual void Operation(STATE &ExtrinsicState);
  34. };

(2)Flyweight.cpp

  1. #include "Flyweight.h"
  2. #include <iostream>
  3. inline STATE Flyweight::GetInstrinsicState()
  4. {
  5. return m_State;
  6. }
  7. FlyweightFactory::~FlyweightFactory()
  8. {
  9. std::list<Flyweight*>::iterator iter1, iter2, temp;
  10. for (iter1 = m_listFlyweight.begin();
  11. iter2 = m_listFlyweight.end();
  12. iter1 != iter2; )
  13. {
  14. temp = iter1;
  15. ++iter1;
  16. delete (*temp);
  17. }
  18. m_listFlyweight.clear();
  19. }
  20. Flyweight* FlyweightFactory::GetFlyweight(const STATE &key)
  21. {
  22. std::list<Flyweight*>::iterator iter1, iter2;
  23. for (iter1 = m_listFlyweight.begin(), iter2 = m_listFlyweight.end();
  24. iter1 != iter2;
  25. ++iter1)
  26. {
  27. if ((*iter1)->GetInstrinsicState() == key)
  28. {
  29. std::cout << "The Flyweight:" << key << "already exists" << std::endl;
  30. return (*iter1);
  31. }
  32. }
  33. std::cout << "Creating a new Flyweight:" << key << std::endl;
  34. Flyweight* flyweight = new ConcreateFlyweight(key);
  35. m_listFlyweight.push_back(flyweight);
  36. }
  37. void ConcreateFlyweight::Operation(STATE & ExtrinsicState)
  38. {
  39. }

(3)main.cpp

  1. #include "FlyWeight.h"
  2. int main()
  3. {
  4. FlyweightFactory flyweightfactory;
  5. flyweightfactory.GetFlyweight("Hell");
  6. flyweightfactory.GetFlyweight("world");
  7. flyweightfactory.GetFlyweight("Hell");
  8. return 0;
  9. }

常见设计模式解析和实现(C++)FlyWeight模式的更多相关文章

  1. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  2. Javascript常见设计模式解析

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己 ...

  3. 设计模式(二十)Flyweight模式

    当使用new关键字生成类的实例时,需要给其分配足够的内存空间.当程序中需要大量对象时,如果都是用new关键字来分配内存,将会消耗大量内存空间.Flyweight模式就是尽量避免new出实例,而是通过尽 ...

  4. 常见设计模式解析和实现(C++)Adapt模式

    作用:将一个类的接口转换成客户希望的另一个接口.Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. UML示意图 1)      采用继承原有接口类的方式 2)采用组合原有接口类 ...

  5. 常见设计模式解析和实现(C++)Prototype模式(原型模式)

    作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML结构图: 抽象基类: 1)  Prototype:虚拟基类,所有原型的基类,提供Clone接口函数 接口函数: 1)  P ...

  6. iOS设计模式解析(六)代理模式

    代理模式:为其他对象创建一个代理以控制对这个对象的访问 UML解释:客户端向Proxy发起一个Request()请求,Proxy对象会把这个Request转发给Proxy对象的RealSubject. ...

  7. 《图解设计模式》读书笔记9-1 Flyweight模式

    目录 模式简介 示例代码 代码功能与实现思路 类图 代码 结果图示分析 模式角色和类图 角色 类图 拓展思路 对多个地方产生影响 什么要共享,什么不要共享 垃圾回收 模式简介 Flyweight是轻量 ...

  8. iOS设计模式解析(四)组合模式

    组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构.组合是的用户对单个对象和组合对象的使用具有一致 Cocoa Touch中组合模式使用:Cocoa Touch框架中,U ...

  9. C++设计模式 -- 解析和实现

    原文地址  http://c.chinaitlab.com/special/sjms/Index.html#a 导航目录 ※ 设计模式解析和实现之一-Factory模式 ※ 设计模式解析和实现之八-C ...

随机推荐

  1. 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)

    Nginx日志主要分为两种:访问日志和错误日志.日志开关在Nginx配置文件(一般在server段来配置)中设置,两种日志都可以选择性关闭,默认都是打开的. 访问日志access_log #日志格式设 ...

  2. Android:密码显示隐藏

    效果: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  3. Java API —— Set接口 & HashSet类 & LinkedHashSet类

    1.Set接口     1)Set接口概述         一个不包含重复元素的 collection,无序(存储顺序和取出顺序不一致),唯一.  (List有序,即存储顺序和取出顺序一致,可重复) ...

  4. HDU 4685 Prince and Princess(二分图+强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:给出n个王子和m个公主.每个王子有一些自己喜欢的公主可以匹配.设最大匹配为M.那么对于每个 ...

  5. Linux改IP后务必重启网络服务

    [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0BOOTPROTO=noneONBOOT=yes ...

  6. Hadoop1.x与Hadoop2的区别

    转自:http://blog.csdn.net/fenglibing/article/details/32916445 六.Hadoop1.x与Hadoop2的区别 1.变更介绍 Hadoop2相比较 ...

  7. std::ofstream由二进制流写文件的问题

    从MPQ包中读取二进制流出来然后文件写到硬盘. DWORD size = SFileGetSize(hFile); char* buffer = new char[size]; std::ofstre ...

  8. IIS Web负载均衡的几种方式

    Web负载均衡的几种实现方式 摘要:负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用 ...

  9. powerScript脚本

    一.powerScript的语法 1.0变量的命名及使用 powerscript的标识符(变量名称)必须以字母或下划线开头,其它的字符可以是下划线(_).短横线(-).美元符号($).号码符号(#) ...

  10. ASP.NET在IE10,IE11中Form表单身份验证失效问题解决方法

    已经研究出解决方案. 在web.config中的forms中增加cookieless="UseCookies"属性即可.   <authentication mode=&qu ...