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

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. POJ1118 Lining Up

    快弄死我了 最后的原因是abs和fabs的区别... 说点收获:1.cmp函数返回的是int,所以不要直接返回double相减的结果2.define inf 1e9和eps 1e-93.在整数相除得到 ...

  2. Tomcat处理HTTP请求源码分析(下)

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  3. java nio知识点总结

    1.NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题.是用来解决传统io的问题的. 用来解决传统io的问题的.用来解决传统io的问题.阻塞的. 2.传统IO中,Stream是单向 ...

  4. 给360的六条建议(禁止异地登录,普通用户500G足够用了)

    个人觉得,360云盘哪怕做个小改进,都不至于走到现在的地步,最后六条建议! 1.弄个实名制,身份证和手机号码双重绑定,每人限制申请一个账户. 2.禁止云盘的一切分享功能,采用封闭式,个人云盘资料其他人 ...

  5. 360云盘、百度云、微云……为什么不出 OS X(Mac 端)应用呢?(用户少,开发成本高)(百度网盘Mac版2016.10.18横空出世)

    已经说的很好了,现有的云盘所谓的 OS X 版只有云同步功能,不过 115 是个例外,不过 115 的现状……不言自明.接下来说点和本题答案无关的,其实在官方客户端流氓 + 限速的大背景下 OS X ...

  6. spring boot 1.4默认使用 hibernate validator

    spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能.hibernate validator 5.2.4 Final是JSR 349 Be ...

  7. 特殊的css样式

    在一定范围大小变化的div .div { width:auto; height:auto; min-height:100px; min-width:100px; max-height:200px; m ...

  8. 结巴分词标注兼容_ICTCLAS2008汉语词性标注集

    计算所汉语词性标记集Version 3.0制订人:刘群 张华平 张浩计算所汉语词性标记集... 10. 说明... 11. 名词 (1个一类,7个二类,5个三类) 22. 时间词(1个一类,1个二类) ...

  9. Hibernate的一个注释 @Transient

    @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basi ...

  10. 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务

    使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...