`
chenchh
  • 浏览: 60800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flyweight模式

阅读更多

Flyweight模式的用意
    Flyweight模式是对象的结构模式。Flyweight模式以共享的方式高效的支持大量的细粒度对象。
    Flyweight对象能够做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。
    一个内部状态是存储在Flyweight对象内部的,并且是不会随环境的改变而有所不同的。因此,一个Flyweight对象可以具有内部状态并可以共享。
    一个外部状态是随环境改变而改变的、不可共享的状态。Flyweight对象的外部状态必须由客户端保存,并在对象被创建后,在需要使用的时候再传入到Flyweight对象内部。
    外部状态不可以影响Flyweight对象的内部状。换句话说,它们是相互独立的。


Flyweight模式的应用
    Flyweight模式在编辑器系统中大量使用。一个文本编辑器往往会提供很多种字体,而通常的做法是将每一个字母做成一个Flyweight对象。该对象的内部状态就是这个字母,而字母在文本中的位置和字模风格等其他信息这是外部状态。比如,字母a可能出现在文本的很多地方,虽然这些字母a的位置和字模风格不同,但是所有这些地方使用的都是同一个字母对象。这样一来,字母对象就可以在整个系统中共享。


单纯Flyweight模式的结构
在单纯Flyweight模式中,所有的Flyweight对象都是可以共享的。其类图如附件中图1所示:
 
单纯flyweight模式所涉及的角色如下:

  • 抽象Flyweight角色:此角色是所有的具体Flyweight类的超类,为这些类规定除需要实现的公共接口。那些需要外部状态的操作可以通过调用业务方法以参数形式传入。
  • ConcreteFlyweight角色:实现抽象Flyweight角色所规定的接口。如果有内部状态的话,必须负责为内部状态提供存储空间。Flyweight对象的内部状态必须与对象所处的环境无关,从而使得对象可以在系统内共享。
  • FlyweightFactory角色:本角色负责创建和管理Flyweight角色。本角色必须保证Flyweight对象可以被系统适当的共享。当一个客户端对象调用一个Flyweight对象的时候,FlyweightFactory角色会检查系统中是否已经有一个符合要求的对象。如果已经有了,FlyweightFactory角色就应当提供这个已有的Flyweight对象;如果没有,这创建一个合适的对象。
  • 客户端角色:本角色需要维护一个对所有Flyweight对象的引用。本角色需要执行存储所有Flyweight对象的外部状态。

复合Flyweight模式的结构
    在上面的单纯Flyweight模式中,所有的Flyweight对象都是单纯Flyweight对象,也就是说都是可以直接共享的。下面考虑一个较为复杂的情况,即将一些单纯Flyweight对象使用合成模式加以复合,形成复合Flyweight对象。这样的复合Flyweight对象本身不能共享,但是它们可以分解成单纯Flyweight对象,而后者则可以共享。
    复合Flyweight模式的类图如附件中图2所示。
 
    该模式涉及的角色有抽象Flyweight角色、ConcreteFlyweight角色、CompositeFlyweight角色、FlyweightFactory角色,以及客户端角色。

  • 抽象Flyweight角色:此角色是所有的ConcreteFlyweight类的超类,为这些类规定出需要实现的公共接口。那些需要外部状态的操作可以通过方法的参数传入。抽象Flyweight的接口使得共享对象变得可能,但是并不是强制子类实行共享,因此并非所有的Flyweight对象都是可以共享的。
  • ConcreteFlyweight角色:实现抽象Flyweight角色所规定的接口。
  • UnsharableFlyweight角色:复合Flyweight角色所代表的对象是不可以共享的,但是一个复合Flyweight对象可以分解成多个本身是单纯Flyweight对象的组合。复合Flyweight对象又称作不可共享的Flyweight对象。
  • FlyweightFactory角色:本角色负责创建和管理Flyweight角色。
  • 客户端角色:本角色需要自行存储所有Flyweight对象的外部状态。

 

Flyweight应当在什么情况下使用
    当以下所有的条件都满足时,可以考虑使用Flyweight模式:
   (1)    一个系统有大量的对象。
   (2)    这些对象耗费大量的内存。
   (3)    这些对象的状态中的大部分都可以外部化。
   (4)    这些对象可以按照内部状态分成很多组,当把外部对象从对象中剔除时,每个组都可以仅用一个对象代替。
   (5)    软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。
    最后,使用Flyweight模式需要维护一个记录了系统已有的所有共享单元的表,而这需要耗费资源。因此,应当在有足够多的Flyweight实例可供共享时才值得使用Flyweight模式。


怎样做到共享
    一个Flyweight对象之所以可以被很多的客户端共享,是因为它只含有可以共享的状态,而没有不可以共享的状态,这是可以使用Flyweight模式的重要前提。
    因此,问题转化为怎样才能重新设计这个常规类,使他能够复合Flyweight类的要求。要做到这一点,需要分两步走:
  (1)    将可以共享的状态和不可以共享的状态从此常规类中区分开来,将不可共享的状态类从类里剔除出去。
  (2)    这个类的创建过程必须由一个工厂对象加以控制。为了达到共享的目的,客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。这个工厂对象应当使用一个内部列表保存所有的已经创建出来的对象。当客户端请求一个新的对象时,工厂对象首先检查列表,看是否已经有一个对象。


Flyweight模式的优点和缺点
    Flyweight模式的优点在于它大幅度的降低内存中对象的数量。但是,它做到这一点所付出的代价也很高:

  • Flyweight模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
  • Flyweight模式将共享对象的状态外部化,而读取外部状态使得运行时间稍微变长。

 

  • 描述: 图片1
  • 大小: 86.6 KB
  • 描述: 图片2
  • 大小: 27 KB
分享到:
评论

相关推荐

    软件模式之Flyweight模式.docx

    《软件模式之Flyweight模式》 Flyweight模式是一种设计模式,其主要目的是通过共享技术来减少内存中对象的数量,从而优化内存使用效率。在对象数量庞大且大部分状态可以外部化的情况下,Flyweight模式尤其适用。它...

    软件模式之Flyweight模式.doc

    软件模式之Flyweight模式.doc

    C++ Flyweight模式

    23种设计模式之十(结构型模式)Flyweight模式

    结构型模式之共享元模式(Flyweight)

    6共享元模式(Flyweight) 用意:以共享的方式高效地支持大量的细粒度对象

    C#设计模式之Flyweight

    设计模式 Flyweight

    java设计模式之Flyweight文.pdf

    Java设计模式中的Flyweight模式是一种结构型设计模式,其主要目标是减少对象的创建,通过共享相似对象来降低内存使用和提高性能。在面向对象编程中,如果对象数量过多,可能会导致内存消耗过大,尤其是在处理大量...

    java设计模式之Flyweight[归纳].pdf

    Java设计模式中的Flyweight模式是一种结构型模式,其主要目的是减少对象的数量,通过共享大量具有相似属性的对象来节省内存和提高性能。Flyweight模式的核心思想是区分对象的内部状态(intrinsic state)和外部状态...

    关于Flyweight模式应用实践的相关介绍

    什么是Flyweight模式? 享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销。可以简单理解用空间换取时间。 举例说明 一般的...

    Java设计模式之共享模式/享元模式(Flyweight模式)介绍

    主要介绍了Java设计模式之共享模式/享元模式(Flyweight模式)介绍,本文讲解了为什么使用共享模式/享元模式、如何使用共享模式/享元模式、Flyweight模式在XML等数据源中应用等内容,需要的朋友可以参考下

    angular-flyweight:使用AngularJS的Flyweight模式的示例实现

    使用Flyweight模式的AngularJS 一个示例,展示了如何使用AngularJS 1.4实现Flyweight模式 本地运行 确保已安装 $ git clone https://github.com/iranreyes/angular-flyweight.git # or clone your own fork $ cd ...

    设计模式精解-GoF 23种设计模式解析

    2.5 Flyweight模式 2.6 Facade模式 2.7 Proxy模式 3 行为模式.....55 3.1 Template模式 3.2 Strategy模式 3.3 State模式 3.4 Observer模式 3.5 Memento模式 3.6 Mediator模式 3.7 Command模式 3.8 Visitor模式 ...

    36种最新设计模式整理

    Design Pattern: Flyweight 模式 46 Design Pattern: Proxy 模式(一) 48 Design Pattern: Proxy 模式(二) 49 Design Pattern: Chain of Responsibility 模式 53 Design Pattern: Command 模式 59 Design Pattern...

    C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight) C++设计模式之享元模式(Flyweight)是一种结构型设计模式,主要用于解决大量相似对象的创建和操作所带来的内存负载问题。该模式的主要设计目标是通过共享对象来减少内存负载,...

    Flyweight.rar

    设计模式中的Flyweight模式,VC源码Flyweight.rar,希望我能把23个模式写全,O(∩_∩)O~

    《软件设计模式(Java版)》每章习题答案

    3. 结构型设计模式的知识,如 Adapter 模式、Bridge 模式、Composite 模式、Decorator 模式、Flyweight 模式、Proxy 模式等。 4. 行为型设计模式的知识,如 Interpreter 模式、Template Method 模式、Iterator 模式...

    设计模式原理与应用之结构型模式.pptx

    在需要大量相似对象的场景下,如文本编辑器中的字符显示,Flyweight模式可以极大地提高效率。 7. **Proxy模式**: - Proxy模式为其他对象提供一个代理,以控制对该对象的访问。代理对象可以增加额外的功能,如缓存...

    JavaScript设计模式与开发实践.pdf

    由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain ...

    设计模式精解-GOF23种设计模式解析(VS2012重写实现包含Linux-Makefile)-代码和原文档已插入本文档.pdf

    5. Flyweight 模式:享元模式是一种结构型模式,旨在降低系统的资源消耗。该模式的优点是能够使得系统更加高效和可扩展。 GOF23种设计模式是软件设计模式中最经典和最重要的23种设计模式,每种模式都有其特点和优点...

    C++设计模式编程之Flyweight享元模式结构详解

    享元模式是一种设计模式,主要用于减少对象的创建,从而提高性能和降低内存占用。在C++编程中,享元模式的应用能够帮助优化内存管理和提高程序效率。享元模式的核心思想是区分对象的内部状态(intrinsic state)和...

Global site tag (gtag.js) - Google Analytics