设计模式 笔记 享元模式 Flyweight
//---------------------------15/04/20----------------------------
//Flyweight 享元模式------对象结构型模式
/*
1:意图:
运用共享技术有效地支持大量细粒度的对象。
2:动机:
3:适用性:
以下条件都成立时才能使用。
1>一个应用程序使用了大量的对象。
2>完全由于使用大量的对象,造成很大的存储开销。
3>对象的大多数状态都可变为外部状态。
4>如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
5>应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的
对象,标识测试将返回真值。
4:结构:
FlyweightFactory:
flyweights--------------------------------->Flyweight:
GetFlyweight(key) Operation(extrinsicState)
{ if(flyweight[key] exists) |
return exisiting flyweight; |
else |
create new flyweight; |
add it to pool of flyweights; |
return the new flyweight; |
} | ------------------------
| | |
| |---->ConcreteFlyweight |--->UnsharedConcreteFlyweight
Client------------| Operation(extrinsicState)| Operation(extrinsicState)
| instrinsicState | allState
--------------------------------
5:参与者:
1>Flyweight
描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
2>ConcreteFlyweight
实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。ConcreteFlyweight对象必须是
可共享的。它存储的内部状态必须和场景无关。
3>UnsharedConcreteFlyweight
并非所有的Flyweight子类都需要被共享。Flyweight接口使得共享成为可能,但是它并不强制共享。
UnsharedConcreteFlyweight对象通常把ConcreteFlyweight对象作为子节点。
4>FlyweightFactory
1)创建并管理flyweight对象。
2)确保合理地共享flyweight。拥有一个接口可以返回一个flyweight对象(如果不存在会创建一个)。
5>Client
1)维持一个对flyweight的引用。
2)计算或存储一个(或多个)flyweight的外部状态。
6:协作:
1>flyweight执行时所需的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象中;而
外部对象则由Client对象存储或计算。当用户调用flyweight的操作时,只需要把状态传递给它。
(就是operation的那个操作,可以传入一个状态,然后由ConcreteFlyweight对象实现操作)
2>用户不应该直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到
ConcreteFlyweight对象。
关于这点,可以直接隐藏掉ConcreteFlyweight的定义,只通过工厂返回基类指针。
7:效果:
1>这个模式使用时间来换空间(大量),因为参数传输,工厂查找,外部状态的计算都会产生运行时的开销。
2>节省的空间由一下决定:
1)因为共享而减少的
实例总数目。
2)对象内部状态的
平均数目。
3)外部状态时
计算的 还是存储的。
总结起来:共享的Flyweight越多,节省越多。节省的量随着共享的状态(内部状态)的增多而增大。外部状态时
计算的而非存储的。则能节省大量存储。
8:实现:
1>删除外部状态
外部状态的数量和大小决定了Flyweight模式的可用性。如果外部状态很多而且存储要求高,那么删除
外部状态就没有意义了。最理想的情况是:外部状态可以由一个单独的对象结构计算得到,且该结构的
存储要求非常小。
2>管理共享对象
因为对象时共享的,所以用户不能直接对它进行实例化,通常FlyweightFactory可以帮助用户找到某个
特定的Flyweight对象。FlyweightFactory通常采用关联存储(set map)帮助用户查找感兴趣的
Flyweight对象。
9:代码示例: */
//abstract Flyweight:声明了Flyweight的接口
class Glyph
{
public:
virtual ~Glyph();
virtual void Draw(Window*, GlyphContext&);
virtual void SetFont(Font*, GlyphContext&);
virtual Font* GetFont(GlyphContext&);
virtual void First(GlyphContext&);
virtual void Next(GlyphContext&);
virtual bool IsDone(GlyphContext&);
virtual Glyph* Current(GlyphContext&);
virtual void Insert(Glyph*,GlyphContext&);
virtual void Remove(GlyphContext&);
protected:
Glyph();
};
//ConcreteFlyweight:这里只需要ascii码就够了
class Character :
public Glyph
{
public:
Character(char);
virtual void Draw(Window*, GlyphContext&);
private:
char _charcode;
};
//客户自己创建维护的
外部状态-字体
//由于是根据范围来确定字体,所以字体采取btree来存储,btree的最底层对应了相应的字体。
class GlyphContext
{
public:
virtual ~GlyphContext();
virtual void Next(int step =
);
virtual Font* GetFont();
virtual void SetFont(Font*,
);
private:
int _index;
BTree* _fonts;
};
//工厂,可以返回具体的Flyweight对象
const
;
class GlyphFactory
{
public:
GlyphFactory();
virtual ~GlyphFactory();
virtual Character* CreateCharacter(char);
virtual Row* CreateRow();
virtual Column* CreateColumn();
private:
Character* _character[NCHARCODES];
};
设计模式 笔记 享元模式 Flyweight的更多相关文章
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- [设计模式] 11 享元模式 Flyweight
转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...
- 【设计模式】—— 享元模式Flyweight
前言:[模式总览]——————————by xingoo 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是 ...
- 结构型设计模式之享元模式(Flyweight)
结构 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部状态. 如果删除对象的外部状态, ...
- 设计模式之享元模式(FlyWeight)
#include <iostream> #include <string> #include <list> #include <vector> usin ...
随机推荐
- 修改SQL Server数据库表的创建时间最简单最直接有效的方法
说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,因为这种操作方式是通用的,即使是对现在最新的SQL Server数据库里面的操作也是一 ...
- 使用TaskScheduler 调度器 实现跨线程的控件访问
//任务调度器 TaskScheduler UIscheduler = null; public Form1() { //获取任务调度器 UIscheduler = TaskScheduler.Fro ...
- win7 win10双系统开机系统引导
以win7启动管理器引导作为启动引导 安装一个easybcd 然后里面添加引导选项(添加新条目---->编辑引导菜单(选择倒计时30秒)把use metro bootloader勾去掉就是默认的 ...
- 判断用户访问方式为pc or Phone
<scripttype="text/javascript"> (function () { var sUserAgent= navigator.userAgent.to ...
- MySql详解(二)
MySql的安装和使用安装过程可以自行百度,非常简单,一直下一步就行,这里省略. 启动和停止MySql服务:• 方式一:通过计算机管理方式右击计算机—管理—服务—启动或停止MySQL服务• 方式二:通 ...
- vagrant up下载box慢的解决办法
即在运行vagrant up时得到其的下载路径,如: https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20190101.0.0/prov ...
- Python2.7-zlib
zlib 模块,提供了压缩和解压缩的函数,都是对字符串进行操作的,可以理解为是各种不同类型的数据经过处理成为字符串或是二进制字符串,再进行压缩解压缩.是和 gzip 相兼容的压缩模块 模块方法: zl ...
- $\rm{NOIp}$板子整理
怎么说呢,整理这个的目的就是为了有个简约的\(list\),方便以后查阅,复习起来不至于太吃力. 并且--好像重温一遍所有,会更有一些新的认识.这也算是对我所学的一点整理了吧. 一.并查集的两种方式 ...
- 写脚本时出现: Permission denied
例如对文件 remove.sh sudo chmod -R 777 remove.sh
- kafka 部署
Windows平台kafka环境的搭建 https://blog.csdn.net/u010054969/article/details/70241478