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、后记

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

  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/qingtian-jlj/p/6185094.html
Copyright © 2011-2022 走看看