常见设计模式解析和实现(C++)FlyWeight模式

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

 

UML结构图:

 

解析:

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

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

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

 

实现:

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

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

 (1)Flywight.h

[cpp] view
plain
copy

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

(2)Flyweight.cpp

[cpp] view
plain
copy

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

(3)main.cpp

[cpp] view
plain
copy

  1. #include "FlyWeight.h"  
  2.   
  3. int main()  
  4. {  
  5.     FlyweightFactory flyweightfactory;  
  6.     flyweightfactory.GetFlyweight("Hell");  
  7.     flyweightfactory.GetFlyweight("world");  
  8.     flyweightfactory.GetFlyweight("Hell");  
  9.   
  10.     return 0;  
  11. }  
时间: 2024-11-02 07:59:44

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

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

作用:将一个类的接口转换成客户希望的另一个接口.Adapt模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.     UML示意图 1)      采用继承原有接口类的方式   2)采用组合原有接口类的方式   解析: Adapt模式其实就是把完成同样一个功能但是接口不能兼容的类桥接在一起使之可以在一起工作,这个模式使得复用旧的接口成为可能. 实现: Adapt模式有两种实现的方法,一种是采用继承原有接口的方法,一种是采用组合原有接口类的方法,这里采用的是第二种实现方法 1)  Ad

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

作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML结构图:   抽象基类: 1)  Prototype:虚拟基类,所有原型的基类,提供Clone接口函数 接口函数: 1)  Prototype::Clone函数:纯虚函数,根据不同的派生类来实例化创建对象. 解析: Prototype模式其实就是常说的"虚拟构造函数"的一个实现,C++的实现机制中并没有支持这个特性,但是通过不同派生类实现的Clone接口函数可以完成与"虚拟构造函数"同样的

设计模式的解析和实现(C++)之十三-FlyWeight模式

作用: 运用共享技术有效地支持大量细粒度的对象. UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候经常使用.比如,在QQ聊天的时候很多时候你懒得回复又不得不回复的时候,一般会用一些客套的话语敷衍别人,如"呵呵","好的"等等之类的,这些简单的答复其实每个人都是提前定义好的,在使用的时候才调用出来.Flyweight就是基于解决这种问题的思路而产生的,当需要一个可以在其它地方共享使用的对象的时候,先去查询是否已经存在了同样的对象,如果

设计模式(十)享元模式Flyweight(结构型)

设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如: 例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案

Java设计模式研究之Flyweight模式

GOF:运用共享技术有效地支持大量细粒度的对象. 解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象.比如说(这里引用GOF书中的例子)一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象.如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了.那么如果要是每个字母都共享一个对象,那么就大大节约了资源. 在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweig

Java设计模式之共享模式/享元模式(Flyweight模式)介绍_java

Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也Flyweight中两个重要概念内

《设计模式解析(第2版•修订版)》目录—导读

作者简介 设计模式解析(第2版•修订版) Alan Shalloway 美国Net Objectives咨询/培训公司的创始人和CEO.他是麻省理工学院的计算机科学硕士,具有30多年面向对象咨询.培训和软件开发的经验,并经常受邀在重要的软件开发会议(包括SD Expro.Java One.OOP和OOPSLA)上演讲. James R. Trott 美国一家大型金融机构的资深顾问.他是应用数学科学硕士.MBA和跨文化研究硕士.在其20年的职业生涯中,他一直将面向对象和基于模式的分析技术运用在知识

云计算设计模式(三)——补偿交易模式

云计算设计模式(三)--补偿交易模式 撤消由一系列步骤,它们共同限定了最终一致性操作中,如果一个或多个步骤失败执行的工作.按照最终一致性模型,业务实现复杂的业务流程和工作流的云托管的应用程序中很常见. 背景和问题 在云中运行的应用程序频繁修改数据.此数据可跨在各种地理位置的所保持的数据源的一个品种传播.为了避免争用,并提高在分布式环境中,例如这样的性能,应用程序不应该试图提供强事务一致性.相反,应用程序应该实现最终一致性.在该模型中,一个典型的业务操作由一系列的独立的步骤.而正在执行这些步骤的系

云计算设计模式(七)——事件获取模式

云计算设计模式(七)--事件获取模式 使用仅追加存储到记录完整一系列描述在一个域上取数据,而不是存储仅仅是当前的状态,从而使存储区可以被用来实现该域对象的动作事件.该图案可以通过避免需要同步的数据模型和商业领域中简化复杂的结构域的任务;提高性能,可扩展性和响应能力;提供交易数据的一致性;并保持完整的审计跟踪和记录,可能使补偿措施. 背景和问题 大多数应用程序使用数据,并在典型的方法是应用到通过更新它作为用户使用的数据保持数据的当前状态.例如,在传统的创建,读取,更新和删除(CRUD)模型的典型数