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

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. oracle触发器详解(转)

    触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 8.1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过 ...

  2. POJ1118 Lining Up

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

  3. Qt学习记录--Qt::CaseSensitive

    Qt::CaseSensitivity 为枚举类型, 可取值Qt::CaseSensitive 和 Qt::CaseInsensitive, 表示匹配的灵敏度. 比较字符串的时候 Qt::CaseSe ...

  4. chmod u+x 脚本文件

    [root@ossec-server Shell]# chmod u+x whologged.sh解释: chmod:改变权限 u:文件所有用户 +x: 增加可执行权限 [root@ossec-ser ...

  5. Android Handler传递参数动态更新UI界面demo

    package com.example.demo_test; import android.app.Activity; import android.os.Bundle; import android ...

  6. mysql shell

    mysql 查询10分钟以内的数据:select *from t_agent where int_last_login>=CURRENT_TIMESTAMP - INTERVAL 10 MINU ...

  7. ios绘图时的坐标处理

    在iOS中,进行绘图操作时,一般主要是在UIView:drawRect中调用 UIGraphicsBeginImageContextWithOptions等一系列函数,有时候直接画图就行,比如UIIm ...

  8. asp.net中Session过期设置方法

    在Asp.net应用中,很多人会遇到Session过期设置有冲突.其中,可以有四处设置Session的过期时间: 一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会 ...

  9. UVa 10561 (SG函数 递推) Treblecross

    如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,对手下一轮再放一个就输了. 最后当“ ...

  10. 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。

    由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...