概述

想想我们编辑文档用的wps,文档里文字很多都是重复的,我们不可能为每一个出现的汉字都创建独立的空间,这样代价太大,最好的办法就是共享其中相同的部分,使得需要创建的对象降到最小,这个就是享元模式的核心,即运用共享技术有效地支持大量细粒度的对象。

享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。内蕴状态是存储在享元对象内部并且不会随环境改变而改变。因此内蕴状态并可以共享。

外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态与内蕴状态是相互独立的。

类图与样例

  1. // Flyweight.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include<string>
  7. #include <map>
  8. using namespace std;
  9.  
  10. class Character
  11. {
  12. public:
  13. virtual ~Character(){};
  14. virtual void SetSize(int,int) = ;
  15. virtual void Display() = ;
  16. protected:
  17. Character() {}
  18. char m_chSymbol;
  19. int m_nWeight;
  20. int m_nHeight;
  21. };
  22.  
  23. class CharacterA:public Character
  24. {
  25. public:
  26. CharacterA()
  27. {
  28. m_chSymbol = 'A';
  29. m_nWeight = ;
  30. m_nHeight = ;
  31. }
  32. virtual ~CharacterA() {}
  33. void SetSize(int nWeight,int nHeight)
  34. {
  35. m_nWeight = nWeight;
  36. m_nHeight = nHeight;
  37. }
  38. void Display()
  39. {
  40. cout << "CharacterA:" << m_chSymbol << "(" << m_nWeight << "," << m_nHeight << ")" << endl;
  41. }
  42. };
  43.  
  44. class CharacterB:public Character
  45. {
  46. public:
  47. CharacterB()
  48. {
  49. m_chSymbol = 'B';
  50. m_nWeight = ;
  51. m_nHeight = ;
  52. }
  53. virtual ~CharacterB() {}
  54. void SetSize(int nWeight,int nHeight)
  55. {
  56. m_nWeight = nWeight;
  57. m_nHeight = nHeight;
  58. }
  59. void Display()
  60. {
  61. cout << "CharacterB:" << m_chSymbol << "(" << m_nWeight << "," << m_nHeight << ")" << endl;
  62. }
  63. };
  64.  
  65. class CharacterFactory
  66. {
  67. public:
  68. CharacterFactory()
  69. {
  70. m_mChar.insert(make_pair<char, Character*>('A', new CharacterA));
  71. m_mChar.insert(make_pair<char, Character*>('B', new CharacterB));
  72. }
  73. virtual ~CharacterFactory() {}
  74. Character* GetCharacter(char chIn)
  75. {
  76. map<char, Character*>::iterator it = m_mChar.find(chIn);
  77. if(it != m_mChar.end())
  78. {
  79. return (Character*)it->second;
  80. }
  81. return NULL;
  82. }
  83. private:
  84. std::map<char, Character*> m_mChar;
  85.  
  86. };
  87. int _tmain(int argc, _TCHAR* argv[])
  88. {
  89.  
  90. cout<<"享元模式:"<<endl;
  91. CharacterFactory *pFactory = new CharacterFactory();
  92. //内蕴状态 存储在享元对象内部并且不会随环境改变而改变
  93.  
  94. Character* ch1 = pFactory->GetCharacter('A');
  95. ch1->Display();
  96. Character* ch2 = pFactory->GetCharacter('B');
  97. ch2->SetSize(, );
  98. ch2->Display();
  99. system("pause");
  100. return ;
  101. }

C++设计模式之享元模式的更多相关文章

  1. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  2. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  3. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

  4. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. Head First设计模式之享元模式(蝇量模式)

    一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  6. 【Unity3D与23种设计模式】享元模式(Flyweight)

    GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...

  7. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  8. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  9. 【设计模式】享元模式(Flyweight)

    摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...

  10. 设计模式之享元模式(PHP实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式, * 它 ...

随机推荐

  1. win安装mysql

    在这讲解的是有关于通过zip解压安装MySQL的方法.有看了网上的其它的教程,讲的有些不够完善,也自己写一篇简述一下.个人还是建议看官方的参考文档非常之详细:https://dev.mysql.com ...

  2. 前端 html head meta

    META(Metadata information) 提供有页面的元信息 例如:页面编码.刷新.跳转.针对搜索引擎和更新频道的描述和关键词 1.另外一种编码写法 <meta http-equiv ...

  3. Atom飞行手册翻译

    https://www.w3cschool.cn/atomflightmanualzhcn/

  4. DOM2和DOM3读书笔记

    二刷<高程>做的笔记,没什么技术含量就不发到首页啦!~DOM1级主要定义HTML和XML文档底层结构,DOM2和DOM3在这个结构基础上引入更多交互能力,也支持更高级的XML特性.DOM2 ...

  5. 解决FlexPaper分页分段加载问题(转)

    FlexPaper是一个开源的PDF文档在线查看控件.用户查看PDF文档不需要安装Acrobat Reader,但需要利用像SwfTools这样的工具预先将PDF文档转成SWF格式的文件.FlexPa ...

  6. Virtualbox中win7虚拟机中U盘不可用问题的解决

    Virtualbox版本是5.0.0,主机运行多是Ubuntu12.04 LTS,虚拟机是Win7 X64.起初Win7正常运行,Virtualbox的增强功能已安装.下面是如何一步一步解决U盘不可用 ...

  7. c/c++ json使用

    比如出名的有CJson,c++一般用jsoncpp http://sourceforge.net/projects/jsoncpp/ jsoncpp:http://www.cnblogs.com/fe ...

  8. 2017 ACM/ICPC Asia Regional Qingdao Online Solution

    A : Apple 题意:给出三个点,以及另一个点,求最后一个点是否在三个点的外接圆里面,如果在或者在边界上,输出“Rejected”,否则输出"Accepted" 思路:先求一个 ...

  9. Entity Framework在WCF中序列化的问题(转)

    问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...

  10. MysqL中的Show Index From Table_Name命令说明

    我们在分析SQL性能的时候,会使用到show index from table_name命令,会返回出下面的列 | Table | Non_unique | Key_name | Seq_in_ind ...