Flyweight 模式
如果一个应用程序使用了太多的对象, 就会造成很大的存储开销。 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同) ,在这种情况我们可以为将对象的状态分为“外部状态”和“内部状态” ,将可以被共享(不会变化)的状态作为内部状态存储在对象中,而外部对象(例如上面提到的字体、大小等)我们可以在适当的时候将外部对象最为参数传递给对象(例如在显示的时候,将字体、大小等信息传递给对象) 。
Flyweight 模式可以解决上面的问题,其典型的结构图为:
- ///////////////Flyweight.h////////////////////////
- #pragma once
- #include <string>
- using namespace std;
- class Flyweight
- {
- public:
- virtual ~Flyweight();
- virtual void Operation(const string& extrinsicState);
- string GetIntrinsicState();
- protected:
- Flyweight(string intrinsicState);
- private:
- string _intrinsicState ;
- };
- class ConcreteFlyweight : public Flyweight
- {
- public:
- ~ConcreteFlyweight();
- ConcreteFlyweight(string intrinsicState);
- void Operation(const string& extrinsicState);
- protected:
- private:
- };
- ///////////////Flyweight.cpp//////////////////////////
- #include "Flyweight.h"
- #include <iostream>
- using namespace std;
- Flyweight::Flyweight(string intrinsicState)
- {
- _intrinsicState = intrinsicState ;
- }
- Flyweight::~Flyweight()
- {
- }
- void Flyweight::Operation(const string& extrinsicState)
- {
- }
- string Flyweight::GetIntrinsicState()
- {
- return this->_intrinsicState ;
- }
- ConcreteFlyweight::ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState)
- {
- cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl;
- }
- ConcreteFlyweight::~ConcreteFlyweight()
- {
- }
- void ConcreteFlyweight::Operation(const string& extrinsicState)
- {
- cout<<"ConcreteFlyweight: 内部["<<this->GetIntrinsicState()<<"] 外部["<<extrinsicState<<"]"<<endl;
- }
- /////////////////FlyweightFactory.h////////////////////////////
- #pragma once
- #include "Flyweight.h"
- #include <vector>
- class FlyweightFactory
- {
- public:
- FlyweightFactory();
- ~FlyweightFactory();
- Flyweight* GetFlyweight(const string& key);
- protected:
- private:
- vector<Flyweight*> _fly ;
- };
- ///////////////////FlyweightFactory.cpp//////////////////////////////
- #include "FlyweightFactory.h"
- #include <iostream>
- using namespace std;
- FlyweightFactory::FlyweightFactory()
- {
- }
- FlyweightFactory::~FlyweightFactory()
- {
- }
- Flyweight* FlyweightFactory::GetFlyweight(const string& key)
- {
- vector<Flyweight*>::iterator it = _fly.begin();
- for (;it != _fly.end() ; it++)
- {
- if ((*it)->GetIntrinsicState() == key)
- {
- cout<<"already created by users...."<<endl;
- return *it ;
- }
- }
- Flyweight* fn = new ConcreteFlyweight(key);
- _fly.push_back(fn);
- return fn ;
- }
- /////////////////////////main.cpp/////////////////////////////////////////////////
- #include "FlyweightFactory.h"
- #include "Flyweight.h"
- #include <iostream>
- using namespace std;
- int main()
- {
- FlyweightFactory* fc = new FlyweightFactory();
- Flyweight* fw1 = fc->GetFlyweight("hello");
- Flyweight* fw2 = fc->GetFlyweight("world");
- cout<<fw1->GetIntrinsicState()<<endl;
- fw1->Operation("red");
- cout<<fw2->GetIntrinsicState()<<endl;
- fw2->Operation("green");
- fc->GetFlyweight("hello")->Operation("black");
- getchar();
- return ;
- }
Flyweight 模式的更多相关文章
- 常见设计模式解析和实现(C++)FlyWeight模式
作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...
- Structual设计--Flyweight模式
1.意图 运用共享技术有效地支持大量细粒度的对象. 2.别名 无 3.动机 有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大.如我们在使用word的时候.假设设置正文字体为:t ...
- Java 实现享元(Flyweight)模式
/** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...
- Flyweight模式_Java中23种设计模式
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用 ...
- Java设计模式(5)共享模式/享元模式(Flyweight模式)
Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...
- 设计模式之——flyweight模式
flyweight模式,又叫做享元模式. 顾名思义,享元模式就是共享一个元素. 百度百科 解释为: 享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减 ...
- Flyweight模式(亨元模式)
这应该算是最好理解的一个设计模式了吧·················· 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个 ...
- flyweight模式
参考资料 • 维基百科:https://en.wikipedia.org/wiki/Flyweight_pattern • 百度百科:http://baike.baidu.com/link?url=R ...
- 设计模式(二十)Flyweight模式
当使用new关键字生成类的实例时,需要给其分配足够的内存空间.当程序中需要大量对象时,如果都是用new关键字来分配内存,将会消耗大量内存空间.Flyweight模式就是尽量避免new出实例,而是通过尽 ...
随机推荐
- vijosP1902学姐的清晨问候
题目:https://vijos.org/p/1902 题解:sb题...扫一遍每个字母出现的次数即可 代码: #include<cstdio> #include<cstdlib&g ...
- 浅谈Redis及其安装配置
一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...
- linux OpenOffice
1.下载所需的安装包 /project/openofficeorg.mirror/4.0.1/binaries/zh-CN/Apache_OpenOffice_4.0.1_Linux_x86-64_ ...
- C# Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...
- angularjs post 跨域
web api搞好了:用Ajax妥妥的:但是前端用的AngulagJS,也懒得再换为Ajax了: 但是问题来了:提示: 已拦截跨源请求:同源策略禁止读取位于 http://x.x.x.x:port/a ...
- cocoapods_第二篇
一.什么是CocoaPods CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理.开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第 ...
- 如何vs升级后10和12都能同时兼容
如图: 项目2008解决方案sln文件升级2012后,都能同时使用. 升级办法:先复制vs2008版本的解决方案文件.升级2012后,再将文件复制到目录里面即可.注意升级过程中产生的升级文件(Upgr ...
- cocos2d-x创建精灵动画
创建动画一般过程: 1.创建精灵框架缓存,并向其中添加相应的动画文件(plist),最后,通过动画集缓存生产动画 CCSpriteFrameCache *cache = CCSpriteFrameCa ...
- hdoj 3157 Crazy Circuits 【有下界最小流】
题目:hdoj 3157 Crazy Circuits 题意:如今要制造一个电路板.电路板上有 n 个电子元件,各个元件之间有单向的电流流向.然后有一个 + .电流进入, -- 电流汇入,然后推断能不 ...
- FreeMarker 自己定义指令(三)
1. 模板文件 test04.ftl foo <@customUpper> bar f <#-- 这里同意使用全部的 FTL --> <#list ["red& ...