zoukankan      html  css  js  c++  java
  • 享元模式

    1、预习

      今天在程序运行的间隙看了一遍这个模式,说实话还真不太懂是什么意思。只是模糊的这么理解:你在开发中可能需要创建大量的对象,而这些对象在比较细的粒度上有非常大相似性,这时候你为了共享这些细粒度的对象,就会用到享元模式(可能说法上不太合适,有待深入使用和理解)。同时,关于这个模式更多的是用在底层开发的设计模式,因此像我这种二次开发的反而用的很少,从而也不太理解这个模式。这里就把当前我理解的写出来,各位可以指正错误。

    2、定义

      享元模式:运用共享技术有效的支持大量细粒度的对象。

      内部状态与外部状态:在享元对象内部且不会随着环境而改变的部分,可以称为是享元对象的内部状态;而随着环境改变而变化的不可以共享的状态就是外部状态了。

      享元模式可以避免大量非常相似的类实例的开销。在设计中,有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本都是相同的,有时候就能够大幅度的减少所需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时再将他们传递进来,就可以通过共享大幅度的减少单个类实例的数量。也就是说,享元模式执行时所需要的参数可以是内部的也可以是外部的,内部状态存储在具体的享元实例中,而外部对象一般考虑由客户端对象存储或计算,当调用某一个享元实例时,将外部状态传递给它。

    3、实例代码(抄写)

      在按照书中的实例代码抄写过后,给我一种这样的感觉:有点像是将工厂模式和单例模式混合起来的样子,通过创建一个哈希表对象(当然根据实际可能不同)来存储所有已经创建的不同的享元,然后通过工厂模式来判断用户需要新建的享元是否已经存在,如果不存在则新建,否则从内存中把已有的享元取出来,然后再加上外部状态,从而最终得到用户所想要的享元实例。

    4、使用场合

      如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的内存开销;或者说对象的大多数状态可以抽象为外部状态,如果删除外部状态,那么可以用相对较少的共享对象取代很多组对象;这些时候就可以考虑使用享元模式。

      享元模式更多的时候是用在底层设计中,因为这里更多的考虑到了系统设计对内存的使用、管理等;实际上在.NET中我们经常使用的string对象在底层就是以享元模式来实现的,比如:

    string objA="享元模式";
    string objB="享元模式";
    bool result=Object.ReferenceEquals(objA,objB);
    //返回值为true

      试想一下,如果每次创建字符串对象都需要创建一个新的对象的话,内存的开销会很大。所以如果第一次创建了字符串对象“享元模式”,那么第二次再创建相同的对象objB时只需要把它的引用指向“享元模式”,这样就实现了同一个字符串对象“享元模式”在内存中的共用。

    5、后记

      就以上对享元模式的理解,还有结合我目前的工作,还真没有用到享元模式的地方,因此理解的稍微浅显了一些(见谅)。后面再真正使用到时还得进一步理解这个模式。

  • 相关阅读:
    Curling 2.0
    POJ
    免费馅饼
    每日一九度之 题目1090:路径打印
    每日一九度之 题目1089:数字反转
    每日一九度之 题目1084:整数拆分
    每日一九度之 题目1083:特殊乘法
    每日一九度之 题目1081:递推数列
    每日一九度之 题目1079:手机键盘
    每日一九度之 题目1077:最大序列和
  • 原文地址:https://www.cnblogs.com/qingtian-jlj/p/6185094.html
Copyright © 2011-2022 走看看