现在的位置: 首页 > 综合 > 正文

黑马程序员_<<享元模式>>

2018年02月17日 ⁄ 综合 ⁄ 共 1916字 ⁄ 字号 评论关闭

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

1.基本概述

      享元设计模式:英文是FlyweightPattern,在拳击比赛中指最轻量级。享员设计模式以共享的方式高效的支持大量的细粒度对象。是一种结构模式,处理类和对象之间的组合,避免大量拥有相同内容的小类的开销(入耗费内存),是大家共享一个类(元类)。

 

2. 由来

              面向对象技术可以很好的解决灵活性或可扩展性问题,但是咋很多情况下需要在系统中增加类和对象的个数,但是对象数量太多时,将导致运行代价过高,带来性能下降等问题。

     享元模式正是为解决这一类问题而诞生。享元模式通过共享技术实现相同或相似对象的重用。

3. 应用

     例如在一个文本系统中,每一个字母定义一个对象,那么大小写就定义了52对象,但是如果在1M的文本中有很对字母,如果还是一个字母定义一个对象的话,那么这对象就太多了,但是如果每一个字母都共享一个对象的话,那么就只需要定义52个对象即可,那么就节省了很多资源。

例如:

public class Demo {
   public static void main(String[] args) {
     String a="abc";
     String b="abc";
     String c="ab"+"c";
     System.out.println(a==b);//true
     System.out.println(b==c);//true
   }
}

所以a,b,c是同一个对象,

 

      还有就是Integer类,这是一个包装类,但是也应用了享元模式,当-128~127之间的数据,那么就是共享其中的一个对象,不会在创建对象,他们是相同的,但是超过这个范围,他们就不会共享同同一个对象

 

public class Demo {
   public static void main(String[] args) {
     Integer a=28;//装箱,自动装箱把Int类型封装成了Integer
     Integer b=28;
     System.out.println(a==b);//true
     //a和b是共享同意个对象
     Integer c=128;
     Integer d=128;
     System.out.println(c==d);//false
     //因为超出了-128~127范围,所以c和d不会共享同一个对象,是两个对象
   }
}

 

 

4. 详细介绍

     享元模式中的对象之所以可以共享,分为内部状态和外部状态

                       内部状态:是存储在享元对象内部的,并且不会随着环境的改变而有所不同,内部状态是可以共享的。

                   
 外部状态
:需要外部环境来设置,是不可以共享的。

 

        在享元模式中共享的是享元对象的内部状态,外部状态需要通过环境来设置,在实际开发总,能够共享内部状态是有限的,因此享元对象一般都设计为较小的对象,包含的内部状态较少,这种对象称为细粒度对象,享元模式的目的就是使用共享技术来实现大量细粒度对象的复用。

 

      定义:

       享元模式:运用共享技术有效的支持大量的细粒度对象的复用,系统只使用少量的对象,而这些对象很相似状态变化很小,可以实现对象的多次复用,由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,是一种对象结构模型。

 

5.  扩展

      享元模式:单纯享元模式和复合享元模式

             单纯享元模式:所有的享元对象都是可以共享的,及所有的抽象享元类的子类都可共享,不存在非共享具体享元类。

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

6.  优缺点

      优点:大幅度地降低内存中对象的数量,节省资源。

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

7. 使用享元模式的条件

 

     1、一个系统中存在着大量的细粒度对象;

     2、这些细粒度对象耗费了大量的内存。

     3、这些细粒度对象的状态中的大部分都可以外部化;

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

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

 

--------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


【上篇】
【下篇】

抱歉!评论已关闭.