如果一个应用程序使用了太多的对象, 就会造成很大的存储开销。 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同) ,在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态” ,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在显示的时候,将字体、大小等信息传递给对象) 。

Flyweight 模式可以解决上面的问题,其典型的结构图为:

  1. ///////////////Flyweight.h////////////////////////
  2. #pragma once
  3. #include <string>
  4. using namespace std;
  5. class Flyweight
  6. {
  7. public:
  8. virtual ~Flyweight();
  9. virtual void Operation(const string& extrinsicState);
  10. string GetIntrinsicState();
  11. protected:
  12. Flyweight(string intrinsicState);
  13. private:
  14. string _intrinsicState ;
  15. };
  16.  
  17. class ConcreteFlyweight : public Flyweight
  18. {
  19. public:
  20. ~ConcreteFlyweight();
  21. ConcreteFlyweight(string intrinsicState);
  22. void Operation(const string& extrinsicState);
  23. protected:
  24. private:
  25. };
  1. ///////////////Flyweight.cpp//////////////////////////
  2. #include "Flyweight.h"
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. Flyweight::Flyweight(string intrinsicState)
  7. {
  8. _intrinsicState = intrinsicState ;
  9. }
  10. Flyweight::~Flyweight()
  11. {
  12.  
  13. }
  14.  
  15. void Flyweight::Operation(const string& extrinsicState)
  16. {
  17.  
  18. }
  19. string Flyweight::GetIntrinsicState()
  20. {
  21. return this->_intrinsicState ;
  22. }
  23.  
  24. ConcreteFlyweight::ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState)
  25. {
  26. cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl;
  27. }
  28. ConcreteFlyweight::~ConcreteFlyweight()
  29. {
  30.  
  31. }
  32. void ConcreteFlyweight::Operation(const string& extrinsicState)
  33. {
  34. cout<<"ConcreteFlyweight: 内部["<<this->GetIntrinsicState()<<"] 外部["<<extrinsicState<<"]"<<endl;
  35. }
  1. /////////////////FlyweightFactory.h////////////////////////////
  2. #pragma once
  3. #include "Flyweight.h"
  4. #include <vector>
  5. class FlyweightFactory
  6. {
  7. public:
  8. FlyweightFactory();
  9. ~FlyweightFactory();
  10. Flyweight* GetFlyweight(const string& key);
  11.  
  12. protected:
  13. private:
  14. vector<Flyweight*> _fly ;
  15. };
  1. ///////////////////FlyweightFactory.cpp//////////////////////////////
  2. #include "FlyweightFactory.h"
  3. #include <iostream>
  4. using namespace std;
  5. FlyweightFactory::FlyweightFactory()
  6. {
  7.  
  8. }
  9. FlyweightFactory::~FlyweightFactory()
  10. {
  11.  
  12. }
  13.  
  14. Flyweight* FlyweightFactory::GetFlyweight(const string& key)
  15. {
  16. vector<Flyweight*>::iterator it = _fly.begin();
  17. for (;it != _fly.end() ; it++)
  18. {
  19. if ((*it)->GetIntrinsicState() == key)
  20. {
  21. cout<<"already created by users...."<<endl;
  22. return *it ;
  23. }
  24. }
  25.  
  26. Flyweight* fn = new ConcreteFlyweight(key);
  27. _fly.push_back(fn);
  28.  
  29. return fn ;
  30.  
  31. }
  1. /////////////////////////main.cpp/////////////////////////////////////////////////
  2. #include "FlyweightFactory.h"
  3. #include "Flyweight.h"
  4. #include <iostream>
  5. using namespace std;
  6. int main()
  7. {
  8. FlyweightFactory* fc = new FlyweightFactory();
  9. Flyweight* fw1 = fc->GetFlyweight("hello");
  10. Flyweight* fw2 = fc->GetFlyweight("world");
  11.  
  12. cout<<fw1->GetIntrinsicState()<<endl;
  13. fw1->Operation("red");
  14.  
  15. cout<<fw2->GetIntrinsicState()<<endl;
  16. fw2->Operation("green");
  17.  
  18. fc->GetFlyweight("hello")->Operation("black");
  19. getchar();
  20. return ;
  21. }

Flyweight 模式的更多相关文章

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

    作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...

  2. Structual设计--Flyweight模式

    1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大.如我们在使用word的时候.假设设置正文字体为:t ...

  3. Java 实现享元(Flyweight)模式

    /** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...

  4. Flyweight模式_Java中23种设计模式

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用 ...

  5. Java设计模式(5)共享模式/享元模式(Flyweight模式)

    Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...

  6. 设计模式之——flyweight模式

    flyweight模式,又叫做享元模式. 顾名思义,享元模式就是共享一个元素. 百度百科 解释为: 享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减 ...

  7. Flyweight模式(亨元模式)

    这应该算是最好理解的一个设计模式了吧·················· 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个 ...

  8. flyweight模式

    参考资料 • 维基百科:https://en.wikipedia.org/wiki/Flyweight_pattern • 百度百科:http://baike.baidu.com/link?url=R ...

  9. 设计模式(二十)Flyweight模式

    当使用new关键字生成类的实例时,需要给其分配足够的内存空间.当程序中需要大量对象时,如果都是用new关键字来分配内存,将会消耗大量内存空间.Flyweight模式就是尽量避免new出实例,而是通过尽 ...

随机推荐

  1. vijosP1902学姐的清晨问候

    题目:https://vijos.org/p/1902 题解:sb题...扫一遍每个字母出现的次数即可 代码: #include<cstdio> #include<cstdlib&g ...

  2. 浅谈Redis及其安装配置

    一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...

  3. linux OpenOffice

    1.下载所需的安装包  /project/openofficeorg.mirror/4.0.1/binaries/zh-CN/Apache_OpenOffice_4.0.1_Linux_x86-64_ ...

  4. C# Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  5. angularjs post 跨域

    web api搞好了:用Ajax妥妥的:但是前端用的AngulagJS,也懒得再换为Ajax了: 但是问题来了:提示: 已拦截跨源请求:同源策略禁止读取位于 http://x.x.x.x:port/a ...

  6. cocoapods_第二篇

    一.什么是CocoaPods CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理.开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第 ...

  7. 如何vs升级后10和12都能同时兼容

    如图: 项目2008解决方案sln文件升级2012后,都能同时使用. 升级办法:先复制vs2008版本的解决方案文件.升级2012后,再将文件复制到目录里面即可.注意升级过程中产生的升级文件(Upgr ...

  8. cocos2d-x创建精灵动画

    创建动画一般过程: 1.创建精灵框架缓存,并向其中添加相应的动画文件(plist),最后,通过动画集缓存生产动画 CCSpriteFrameCache *cache = CCSpriteFrameCa ...

  9. hdoj 3157 Crazy Circuits 【有下界最小流】

    题目:hdoj 3157 Crazy Circuits 题意:如今要制造一个电路板.电路板上有 n 个电子元件,各个元件之间有单向的电流流向.然后有一个 + .电流进入, -- 电流汇入,然后推断能不 ...

  10. FreeMarker 自己定义指令(三)

    1. 模板文件 test04.ftl foo <@customUpper> bar f <#-- 这里同意使用全部的 FTL --> <#list ["red& ...