Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级"。这里使用"享元 模式"更能反映模式的用意。

享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。内蕴状态是存储在享元对象内部并且 不会随环境改变而改变。因此内蕴状态并可以共享。
外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态与内蕴状态是相互独立的。

单纯享元模式的结构:

结构说明:

在单纯享元模式中,所有的享元对象都是可以共享的。单纯享元模式所涉及的角色如下:

  抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公 共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。
  具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。
  享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。

    如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。
  客户端(Client)角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享 元对象的外蕴状态。

单纯享元模式示例代码:

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. int extrinsicstate = ;
  6. FlyweightFactory factory = new FlyweightFactory();
  7.  
  8. Flyweight fx = factory.GetFlyweight("X");
  9. fx.Operaton(extrinsicstate);
  10.  
  11. Flyweight fy = factory.GetFlyweight("Y");
  12. fy.Operaton(extrinsicstate);
  13.  
  14. Flyweight fZ = factory.GetFlyweight("Z");
  15. fZ.Operaton(extrinsicstate);
  16.  
  17. Console.ReadKey();
  18.  
  19. }
  20. }
  21.  
  22. class FlyweightFactory
  23. {
  24. private Hashtable flyweights = new Hashtable();
  25.  
  26. public FlyweightFactory()
  27. {
  28. flyweights.Add("X", new ConcreteFlyweight());
  29. flyweights.Add("Y", new ConcreteFlyweight());
  30. flyweights.Add("Z", new ConcreteFlyweight());
  31. }
  32.  
  33. public Flyweight GetFlyweight(string key)
  34. {
  35. return ((Flyweight)flyweights[key]);
  36. }
  37. }
  38.  
  39. abstract class Flyweight
  40. {
  41. abstract public void Operaton(int extrinsicstate);
  42. }
  43.  
  44. class ConcreteFlyweight : Flyweight
  45. {
  46. private string intrinsicstate = "A";
  47. public override void Operaton(int extrinsicstate)
  48. {
  49. Console.WriteLine("ConcreteFlyweight:instrinsicstate:{0},extrinsicstate:{1}", intrinsicstate, extrinsicstate);
  50. }
  51. }

运行结果:

复合享元模式的结构:
将一些单纯享元使用合成模式加以复合,形成复合享元对象。这样的复合享元对象本身不能共享,但是它们可以分解成单纯享元对象,而后者则可以共享。

复合享元模式类图:

复合享元模式类图说明:

享元模式所涉及的角色有抽象享元角色、具体享元角色、复合享元角色、享员工厂角色,以及客户端角色等。
  抽象享元角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过方法的参数传入。

    抽象享元的接口使得享元变 得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。
  具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与

    对象所处的周围环境无关,从而使得享元对象可以在系统内共享。有 时 候 具 体 享 元 角 色又叫做单纯具体享元角色,因为复合享元角色是由单纯具体享元角色通过复合而成的。
  复合享元(UnsharableFlyweight)角色:复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。

    复合享元角色又称做不可共享的享元对象。
  享元工厂(FlyweightFactoiy)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象请求一个享元对象的时候,享元工厂角色需要检查
    系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个新的合适
    的享元对象。
  客户端(Client)角色:本角色还需要自行存储所有享元对象的外蕴状态。

享元模式适用情形:

当以下所有的条件都满足时,可以考虑使用享元模式:
  • 一个系统有大量的对象。

  • 这些对象耗费大量的内存。

  • 这些对象的状态中的大部分都可以外部化。

  • 这些对象可以按照内蕴状态分成很多的组,当把外蕴对象 从对象中剔除时,每一个组都可以仅用一个对象代替。

  • 软件系统不依赖于这些对象的身份,换言之,这些对象可 以是不可分辨的。

享元模式的优缺点:

  享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:
  • 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

  • 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

十二、享元(Flyweight)模式--结构模式(Structural Pattern)的更多相关文章

  1. C#设计模式之十二享元模式(Flyweight)【结构型】

    一.引言   今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看."享元"是不是可以这样 ...

  2. javascript设计模式学习之十二——享元模式

    一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...

  3. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  4. 设计模式C++描述----12.享元(Flyweight)模式

    一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...

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

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

  6. 设计模式(十二): Flyweight享元模式 -- 结构型模式

    说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...

  7. 十一、结构模式之享元(Flyweight)模式

    什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...

  8. 享元(FlyWeight)模式

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

  9. python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

随机推荐

  1. Managing TCP Connections in Dynamic Spectrum Access Based Wireless LANs

    2010年IEEE Secon的一篇文章.当然了,应该是之前就写好了,发表过,还是直接投到Secon了呢?直接投的吧,Secon不接受已发表过的吧. 本文的着笔点:有线网与DSAN(启用了DSA特性的 ...

  2. Django 反向生成 从数据库生成Model

    Django 反向生成 从数据库生成Model 使用Django生成Model python manage.py inspectdb或python manage.py inspectdb > m ...

  3. 关于导入oracle10g的数据到sqlserver2005里的方案总结

    由于项目需求,现需要将oracle的数据全部导入到sqlserver中,一下算是自己的总结小计吧. sqlserver有自己的导入数据的功能,其中就有提供两种方式从oracle导入数据. 两种方式就不 ...

  4. 【转】一个从32位机器移植到64位机器时的c问题

    原文网址:http://www.jiancool.com/article/96402954887/ 最近工作中遇到了一个讨厌的问题,在32位机器上运行的好好的,但是在64位机器上,出现了诡异的 Seg ...

  5. Lowest Common Ancestor of a Binary Search Tree 解答

    Question Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes ...

  6. Binary Search Tree BST Template

    Use one queue + size variable public class Solution { public ArrayList<ArrayList<Integer>&g ...

  7. python3-day1(基础总结)

    总结比较抽象的难点: 1.二进制运算 60 & 13  =12 60 |  13  =61 60 ^ 13  =49 60<<2   =240 60>>2   =15 ...

  8. c++之 常用类型

    C/C++常用类型的范围 C/C++里常用的类型及表示范围如下表所示: 类型 sizeof 表示范围 说明 char 1 -128 - 127 -2^7 - (2^7 - 1) short 2 -32 ...

  9. (转)25个增强iOS应用程序性能的提示和技巧--中级篇

    在性能优化时,当你碰到一些复杂的问题,应该注意和使用如下技巧: 9.重用和延迟加载View10.缓存.缓存.缓存11.考虑绘制12.处理内存警告13.重用花销很大的对象14.使用Sprite Shee ...

  10. 开源 免费 java CMS - FreeCMS2.0 会员我的评论

    项目地址:http://www.freeteam.cn/ 我的评论 从左側管理菜单点击我的评论进入. 在这里能够查看当前登录会员的全部评论记录. 删除评论 选择评论然后点击删除button能够完毕删除 ...