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

设计模式:享元模式

    博客分类:
  • Java
 
阅读更多
十. 享元模式
整理自 《java与模式》阎宏编著


1.意图:
    运用共享技术有效地支持大量细粒度的对象。

2.类图:
      单纯享元模式:

        

      复合享元模式:
      
         

3.原理:
      享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。
      一个内蕴状态是存储在享元对象内部的,并且不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。
      一个外蕴状态是随环境改变而改变的,不可以共享状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传到享元对象内部。
      外蕴状态不可以影响享元对象的内蕴状态,它们是相互独立的。所有的内蕴状态在对象创建完后就不可再改变。



4.特征:

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

  复合享元模式:
    抽象享元角色:所有的具体享元类的超类,规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。
    具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。复合享元角色是由具体享元角色通过复合而成。
    复合享元角色:复合享元角色所代表的对象是不可以共享的,但是可以分解成多个可以共享的具体享元角色。
    享元工厂角:负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象时,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果有,享元工厂就提供这个已经有的享元对象,如果没有,享元工厂创建一个适当的享元对象。
    客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。


5.说明:
6.使用案例:
      Java中的String对象。
       在编辑器系统中,每个字母做成一个享元对象,内蕴状态就是这个字母,而字母在文本中的位置和风格就是外蕴状态。

7.代码:
     单纯享元模式:

   // Client.java

   public class Client

   {      

       private FlyweightFactory flyweightFactory = null;  

       public Client()

       {

          flyweightFactory = new FlyweightFactory();

       }

   }

   // FlyweightFactory.java
   public class FlyweightFactory

   {

        private flyweight.Flyweight lnkFlyweight;

     private HashMap flyweightPools;



        public FlyweightFactory()

        {

            flyweightPools = new HashMap();

        }



        //客户端不能直接实例化享元类,必须通过工厂类。

        public Flyweight getFlyweight(Object key)

        {

            if (flyweightPools.containsKey(key))

            {

                 return (Flyweight) flyweightPools.get(key);

            }

            else

            {

                 Flyweight newFlyweight = new ConcreteFlyweight(key);

                 flyweightPools.put(key, newFlyweight);

                 return newFlyweight;

            }

        }

   }

   // Flyweight.java

   public interface Flyweight

   {

        //一个示意性的方法,参数是外蕴状态

        void sampleOperation(Object extrinsicState);

   }

   // ConcreteFlyweight.java

   public class ConcreteFlyweight implements Flyweight

   {

       private Object  intrisnicState;

 

       //构造函数,内蕴状态作为参数传入,

        public ConcreteFlyweight(Object intrisnicState)

        {

            // initialize internal state

            this.intrisnicState = intrisnicState;

        } 



        //外蕴状态作为参数传入,修改了方法的行为,不改变内蕴状态。

        public void sampleOperation(Object extrinsicState)

        {

             //....

        }

   }
分享到:
评论

相关推荐

    《设计模式:可复用面向对象软件的基础》英文版

    如适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰者模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)等。 - **行为型模式**:关注于对象间的职责分配,...

    设计模式:可复用面向对象软件的基础--详细书签版

    4.6 flyweight(享元)—对象结构型 模式 128 4.7 proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 adapter与bridge 144 4.8.2 composite、decorator与proxy 145 第5章 行为模式 147 ...

    软件设计模式——享元模式设计报告

    享元模式是一种软件设计模式,它的主要目的是为了提高性能,减少对象的创建,尤其是在大量相似对象需要被创建的情况下。在给定的咖啡店案例中,享元模式的应用可以帮助优化内存使用,避免为每杯咖啡的配料表分配独立...

    设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。享元模式通过共享已有对象来减少内存中对象的数量,从而达到降低内存消耗的效果。这种模式适用于那些轻量级对象,...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...

    实验九:享元模式.rar之java设计模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在大量对象创建时。在享元模式中,系统会共享那些具有大量相同状态的对象,从而减少内存中对象的数量,达到节省内存的目的。Java作为...

    设计模式:可复用的面向对象软件的基础

    结构型模式的例子有适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。 3. 行为型模式:这些模式涉及类或对象的职责分配,它们描述了如何对各个类或对象之间如何分配职责以及如何协调它们...

    设计模式的享元模式的例子

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...

    designPattern8:设计模式:享元模式,享元模式(分享网站代码),享元模式(内部和外部)

    享元模式是一种优化资源使用的软件设计模式,尤其适用于对象创建成本较高或系统内存有限的场景。在Java等面向对象编程语言中,享元模式通过共享大量相似对象来减少内存消耗,提高性能。在这个名为"designPattern8"的...

    设计模式面面观(14):享元模式(Facade Pattern)-结构型模式

    设计模式面面观(14):享元模式(Facade Pattern)-结构型模式 http://blog.csdn.net/fanweiwei/archive/2008/04/25/2326692.aspx

    设计模式:可复用面向对象软件设计基础(附源码)

    2. **结构型模式**:如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。这些模式关注如何将类或对象以某种方式组合起来,以实现新的功能或改善现有结构。 3. **行为型模式**:包括责任...

    javascript 设计模式之享元模式原理与应用详解

    本文实例讲述了javascript 设计模式之享元模式。分享给大家供大家参考,具体如下: 享元模式说明 定义:用于解决一个系统大量细粒度对象的共享问题: 关健词:分离跟共享; 说明: 享元模式分单纯(共享)享元模式,...

    Java设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在Java中,享元模式常用于处理大量相似对象的场景,例如在图形界面中绘制大量相似的...

    1.《设计模式:可复用面向对象软件的基础(完整书签)》

    总的来说,《设计模式:可复用面向对象软件的基础》是一本深入理解和应用面向对象设计的必备书籍,它不仅介绍了23种核心设计模式,还提供了大量实例和解释,帮助读者将理论知识转化为实际的编程技巧。通过对这本书的...

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    在这个“C#面向对象设计模式纵横谈(12)”中,我们将深入探讨享元模式的概念、实现方式以及如何在实际项目中应用。 享元模式的核心思想是区分对象的状态和行为。状态分为内部状态和外部状态,其中内部状态是对象共有...

    设计模式-享元模式(讲解及其实现代码)

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低系统内存占用、提高性能的目的。在软件工程中,当系统中存在大量相似或重复的对象时,享元模式尤为适用。 享元模式的核心是...

Global site tag (gtag.js) - Google Analytics