flyweight模式,即享元模式,属于结构模式的一种,通过共享相同的数据对象,避免产生重复,从而提高内存的使用效率和程序的运行速度。
Flyweight有两个重要的概念,内部状态intrinsic和外部状态extrinsic。Flyweight的内部状态用来共享数据对象。
Flyweight模式中常出现在Factory模式中。Flyweight factory负责维护一个Flyweight pool来存放内部状态的对象。
代码例子:
- public interface Flyweight {
- public void operation( ExtrinsicState state );
- }
-
-
- public interface ExtrinsicState {
- }
下面是接口的具体实现(ConcreteFlyweight) ,并为内部状态增加内存空间,ConcreteFlyweight必须是可共享的,它保存的任何状态都必须是内部(intrinsic),也就是说,ConcreteFlyweight必须和它的应用环境场合无关。
- public class ConcreteFlyweight implements Flyweight {
- private IntrinsicState state;
-
- public void operation( ExtrinsicState state ) {
-
- }
- }
当然,并不是所有的Flyweight具体实现子类都需要被共享的,所以还有另外一种不共享的ConcreteFlyweight:
- public class UnsharedConcreteFlyweight implements Flyweight {
- public void operation( ExtrinsicState state ) {
- }
- }
Flyweight factory负责维护一个Flyweight池(存放内部状态),,当客户端请求一个共享Flyweight时,这个factory首先搜索池中是否已经存在请求的对象,如果有,factory只是简单返回这个对象,否则,创建一个新的对象加入到池中,再返回这个对象。
- public class FlyweightFactory {
-
- private Hashtable flyweights = new Hashtable();
-
- public Flyweight getFlyweight( Object key ) {
-
- Flyweight flyweight = (Flyweight) flyweights.get(key);
-
- if( flyweight == null ) {
-
- flyweight = new ConcreteFlyweight();
- flyweights.put( key, flyweight );
- }
-
- return flyweight;
- }
- }
至此,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模式》 Flyweight模式是一种设计模式,其主要目的是通过共享技术来减少内存中对象的数量,从而优化内存使用效率。在对象数量庞大且大部分状态可以外部化的情况下,Flyweight模式尤其适用。它...
**C++ Flyweight模式** Flyweight模式是一种设计模式,属于结构型模式的一种,它主要解决的是在大量对象创建时可能导致的内存消耗问题。在计算机科学中,尤其是编程领域,内存管理是一个关键的话题,Flyweight模式...
在C#中,Flyweight模式尤其适用于那些内部状态可共享、外部状态可变的对象场景。 享元模式通常包含以下关键角色: 1. **享元接口(Flyweight Interface)**:定义了客户程序与享元对象交互的接口,规定了享元对象能...
软件模式之Flyweight模式.doc
6共享元模式(Flyweight) 用意:以共享的方式高效地支持大量的细粒度对象
Flyweight模式的核心思想是共享对象,通过复用大量相似对象来减少内存占用。这种模式通常在处理大量细粒度对象时非常有效,尤其是在这些对象大部分状态都可以外部化的情况下。例如,在文本编辑器中,每个字符可能都...
Java设计模式中的Flyweight模式是一种结构型设计模式,其主要目标是减少对象的创建,通过共享相似对象来降低内存使用和提高性能。在面向对象编程中,如果对象数量过多,可能会导致内存消耗过大,尤其是在处理大量...
Java设计模式中的Flyweight模式是一种结构型模式,其主要目的是减少对象的数量,通过共享大量具有相似属性的对象来节省内存和提高性能。Flyweight模式的核心思想是区分对象的内部状态(intrinsic state)和外部状态...
什么是Flyweight模式? 享元模式(Flyweight Pattern)是一种软件开发中的设计模式,其主要解决的问题是通过类对象的共享,来避免大量创建拥有相同内容的对象的开销。可以简单理解用空间换取时间。 举例说明 一般的...
使用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)是一种结构型设计模式,主要用于解决大量相似对象的创建和操作所带来的内存负载问题。该模式的主要设计目标是通过共享对象来减少内存负载,...
UML图示例展示了单纯Flyweight模式和复合Flyweight模式的结构。 #### 9. Bridge 模式 - **Bridge 模式**:Bridge模式用于将抽象化与实现化解耦,使得两者可以独立变化。这种模式可以帮助开发者管理系统的可变因素...
享元模式是一种结构型设计模式,它通过共享已有对象来减少对系统资源的消耗,从而提高性能。在Java中,享元模式常用于处理大量相似对象的场景,尤其是在内存管理中,通过对象复用来减少内存占用。以下是享元模式的...
由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain ...
在需要大量相似对象的场景下,如文本编辑器中的字符显示,Flyweight模式可以极大地提高效率。 7. **Proxy模式**: - Proxy模式为其他对象提供一个代理,以控制对该对象的访问。代理对象可以增加额外的功能,如缓存...
Flyweight模式通过共享技术有效支持大量细粒度的对象,可以大幅度减少内存占用并提高性能。 #### Facade模式 Facade模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加...
9. **Flyweight模式**:Flyweight模式属于结构型设计模式,用于减少大量细粒度对象的创建,通过共享对象来支持大量的对象实例,特别适用于内存有限的环境。 10. **Iterator模式**:Iterator模式是一种行为设计模式...