//---------------------------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的更多相关文章

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

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

  2. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  3. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

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

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

  5. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  6. [设计模式] 11 享元模式 Flyweight

    转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...

  7. 【设计模式】—— 享元模式Flyweight

    前言:[模式总览]——————————by xingoo 模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是 ...

  8. 结构型设计模式之享元模式(Flyweight)

    结构 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部状态. 如果删除对象的外部状态, ...

  9. 设计模式之享元模式(FlyWeight)

    #include <iostream> #include <string> #include <list> #include <vector> usin ...

随机推荐

  1. ubuntu下配置时间同步NTP

    1参考文献: 1.鸟哥的Linux私房菜:第十五章.时间服务器: NTP 服务器(强烈建议看完) 2.http://www.crsay.com/wiki/wiki.php/server/centos/ ...

  2. MySQL案例08:MySQL Scheduler Events带来的风险

    定时任务是我们开发.运维人员经常用到的,比如cron,job,schedule,events scheduler等都是为了方便我们重复执行某项工作而无需人工参与而设计,这里我要说的是MySQL数据库本 ...

  3. w3school 基础学习

    http://www.w3school.com.cn/ http://www.w3school.com.cn/sql/sql_quickref.asp

  4. cat > file << EOF 与 cat > file << -

    当我们在使用kickstart 的时候,会遇到写网卡配置文件的情况,这时候我们使用cat > file << EOF 命令等,可以从标准输入中接受输入并保存到 file 文件中. c ...

  5. saltstack二次开发(一)

    Saltstack简介 Salt是一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的包被安装,指定的服务在运行),一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则 ...

  6. 三、git管理修改

    一.修改提交 如下图,Git分工作区和版本库(.git隐藏目录中). 在每次修改后 git add "file name" 其实是把修改内容提交到本地版本库的 暂存区(stage) ...

  7. jQuery1.9+ 废弃的函数和方法 升级Jquery版本遇到的问题

    面临问题 很久没关注JQuery了,今天突然想升级一下系统中使用的jquery版本,突然发现,升级JQuery版本到1.9之后出现了很多问题,比如:$.browser is undefined.突然就 ...

  8. oninput和onpropertychange实时监听输入框值的变化

    oninput和onpropertychange实时监听输入框值的变化 传统监听输入框的做法就是使用keyup.keydown.keypress,或者change事件来实现,但keyup.keydow ...

  9. java多线程中的死锁情况读书笔记

    多线程中的死锁 在前面的分析中,我们知道一个对象可以用Synchronized方法或者其他的加锁形式来防止别的任务在互斥还没有释放的时候就访问这个对象. 试想一下这样的情况:某个任务在等待另一个任务, ...

  10. 开启路由转发 - route add -net 0.0.0.0 netmask 0.0.0.0 gateway 192.168.0.131 window tracert 追踪路由

    1.登录方式内网访问172.28.101.0/19网段的方法:在192.168.1.0/24网段的上网机器上,或在自己的操作机上加个192.168.1.0网段的ip,注意不要跟别人设置的冲突了,并添加 ...