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

flyweight模式

阅读更多

      flyweight模式,即享元模式,属于结构模式的一种,通过共享相同的数据对象,避免产生重复,从而提高内存的使用效率和程序的运行速度。

      Flyweight有两个重要的概念,内部状态intrinsic和外部状态extrinsic。Flyweight的内部状态用来共享数据对象。

      Flyweight模式中常出现在Factory模式中。Flyweight factory负责维护一个Flyweight pool来存放内部状态的对象。

      代码例子:

 
  1. public interface Flyweight {  
  2.   public void operation( ExtrinsicState state );  
  3. }  
  4.   
  5. //用于本模式的抽象数据类型(自行设计)  
  6. public interface ExtrinsicState { 
  7. }  

       下面是接口的具体实现(ConcreteFlyweight) ,并为内部状态增加内存空间,ConcreteFlyweight必须是可共享的,它保存的任何状态都必须是内部(intrinsic),也就是说,ConcreteFlyweight必须和它的应用环境场合无关。

 
  1. public class ConcreteFlyweight implements Flyweight {  
  2.   private IntrinsicState state;  
  3.     
  4.   public void operation( ExtrinsicState state ) {  
  5.     //具体操作  
  6.   }  

     当然,并不是所有的Flyweight具体实现子类都需要被共享的,所以还有另外一种不共享的ConcreteFlyweight:

 
  1. public class UnsharedConcreteFlyweight implements Flyweight {  
  2.   public void operation( ExtrinsicState state ) { 
  3.    }  
  4. }  

      Flyweight factory负责维护一个Flyweight池(存放内部状态),,当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经存在请求的对象,如果有,factory只是简单返回这个对象,否则,创建一个新的对象加入到池中,再返回这个对象。

 
  1. public class FlyweightFactory {  
  2.   //Flyweight pool  
  3.   private Hashtable flyweights = new Hashtable();  
  4.   
  5.   public Flyweight getFlyweight( Object key ) {  
  6.   
  7.     Flyweight flyweight = (Flyweight) flyweights.get(key);  
  8.   
  9.     if( flyweight == null ) {  
  10.       //产生新的ConcreteFlyweight  
  11.       flyweight = new ConcreteFlyweight();  
  12.       flyweights.put( key, flyweight );  
  13.     }  
  14.   
  15.     return flyweight;  
  16.   }  
  17. }   

至此,Flyweight模式的基本框架已经就绪,我们看看如何调用:

FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1 = factory.getFlyweight( "Fred" );
Flyweight fly2 = factory.getFlyweight( "Wilma" );
......

从调用上看,好象是个纯粹的Factory使用,但奥妙就在于Factory的内部设计上。

(参考自 板桥里人 http://www.jdon.com 2002/05/02 )

 

 

分享到:
评论

相关推荐

    软件模式之Flyweight模式.docx

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

    C++ Flyweight模式

    **C++ Flyweight模式** Flyweight模式是一种设计模式,属于结构型模式的一种,它主要解决的是在大量对象创建时可能导致的内存消耗问题。在计算机科学中,尤其是编程领域,内存管理是一个关键的话题,Flyweight模式...

    C#设计模式之Flyweight

    在C#中,Flyweight模式尤其适用于那些内部状态可共享、外部状态可变的对象场景。 享元模式通常包含以下关键角色: 1. **享元接口(Flyweight Interface)**:定义了客户程序与享元对象交互的接口,规定了享元对象能...

    软件模式之Flyweight模式.doc

    软件模式之Flyweight模式.doc

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

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

    设计模式之轻量级Flyweight

    Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理大量细粒度对象时非常有效,尤其是在这些对象大部分状态都可以外部化的情况下。例如,在文本编辑器中,每个字符可能都...

    java设计模式之Flyweight文.pdf

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

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

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

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

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

    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 ...

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

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

    23种设计模式的uml表示

    UML图示例展示了单纯Flyweight模式和复合Flyweight模式的结构。 #### 9. Bridge 模式 - **Bridge 模式**:Bridge模式用于将抽象化与实现化解耦,使得两者可以独立变化。这种模式可以帮助开发者管理系统的可变因素...

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

    享元模式是一种结构型设计模式,它通过共享已有对象来减少对系统资源的消耗,从而提高性能。在Java中,享元模式常用于处理大量相似对象的场景,尤其是在内存管理中,通过对象复用来减少内存占用。以下是享元模式的...

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

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

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

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

    设计模式专题---设计模式示例代码(全)(python--c++)

    9. **Flyweight模式**:Flyweight模式属于结构型设计模式,用于减少大量细粒度对象的创建,通过共享对象来支持大量的对象实例,特别适用于内存有限的环境。 10. **Iterator模式**:Iterator模式是一种行为设计模式...

    C++设计模式.pdf

    Flyweight模式通过共享技术有效支持大量细粒度的对象,可以大幅度减少内存占用并提高性能。 #### Facade模式 Facade模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加...

Global site tag (gtag.js) - Google Analytics