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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 作用:运用共享技术有效地支持大量细粒度的对象   UML结构图:   解析: 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. }  
目录
相关文章
|
4天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
9天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
9天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
9天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
9天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
9天前
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
3天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
16天前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
23 0
|
16天前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
50 0
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
60 2

推荐镜像

更多