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

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. 搭建网站 discuzx ecshop php

    1.http://www.comsenz.com/downloads/install/discuzx下载

  2. Java中转UTC时间字符串(含有T Z)为local时间

    在Java中我们需要转换相应格式的字符串,很多时候我们想到用SimpleDateFormat类来解析.但是最近我在调用一个第三方的接口时返回的 JSON字符串中有个expires字段的值是2014-0 ...

  3. docker: "build" requires 1 argument. See 'docker build --help'.

    http://bbs.csdn.net/topics/391040030 docker build  --tag="ouruser/sinatra:v3" -<Dockerf ...

  4. TCL语言笔记:TCL中的控制结构命令

    一.引言 控制结构允许程序根据不同的状态.条件和参数来选择不同的处理和执行路径,从而使代码具有更强的灵活性.健壮性和可读性. Tcl 提供了 if.if/else.if/elseif.foreach. ...

  5. Quartz的任务的临时启动和暂停和恢复

    Quartz的任务的临时启动和暂停和恢复 在项目中需要手动启停某些服务,那么需要有一个控制这些任务的类.由于任务是有Quartz控制的,我们只需要通过Quartz的相关的API实现相关的功能即可. p ...

  6. Java解压上传zip或rar文件,并解压遍历文件中的html的路径

    1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception { HttpSession session = request.getSe ...

  7. 伪分布模式下使用java接口,访问hdfs

    package com.bq.pro; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import ...

  8. BZOJ 3132 上帝造题的七分钟(二维树状数组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3132 题意:给出一个矩阵,两种操作:(1)将某个子矩阵的数字统一加上某个值:(2)查询某 ...

  9. Java视频教程

    http://outofmemory.cn/java/video/ http://outofmemory.cn/tutorial/

  10. java开发之匿名内部类,接口的使用

    下面的例子是Java.JDK7学习笔记上的 打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息 1.Client.java public class Client { pri ...