0%

设计模式之结构型模式(六):享元模式

1. 享元模式概述

  • 概念

    • 运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变换很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此又称为轻量级模式
    • 享元模式体现的是程序可复用的特点,为了节约宝贵的内存,程序应该尽可能地复用,就像《极限编程》作者 Kent 在书里说到的那样:Don’t repeat yourself。简单来说享元模式就是共享对象,提高复用性
  • 特点

    • 有个细节值得注意:有些对象本身不一样,但通过一点点变化后就可以复用,编程时可能稍不注意就会忘记复用这些对象
    • 比如说伟大的超级玛丽,草和云更改一下颜色就可以实现复用;里面是三种乌龟,换一个颜色、加一个装饰就变成了不同的怪。在超级玛丽中,这样的细节还有很多,正是这些精湛的复用使得这一款红遍全球的游戏仅有 40KB 大小,正是印证了那句名言:神在细节之中
  • 应用

    • Java Integer 的实现中,-128 到 127 之间的整型对象会被事先创建好,缓存在 Integer 的内部类 IntegerCache 中。当使用自动装箱或者 valueOf() 方法创建这个数值区间的整型对象时,会复用 IntegerCache 类事先创建好的对象。这里的 IntegerCache 类就是享元工厂类,事先创建好的整型对象就是享元对象
    • Java String 的实现中,JVM 开辟一块存储区专门存储字符串常量,这块存储区叫字符串常量池,类似于 Integer 中的 IntegerCache。不过,更 IntegerCache 不同的是,它并非事先创建需要共享的对象,而是在程序的运行期间,根据需要来创建和缓存字符串常量
  • 缺点

    • 享元模式对 JVM 的垃圾回收并不友好。因为享元工厂类一直保存了对享元对象的引用,这就导致了享元对象在没有任何代码使用的情况下,也并不会被 JVM 垃圾回收机制自动回收掉
    • 因此,在某些情况下,如果对象的生命周期很短,也不会被密集使用,利用享元模式反倒可能会浪费更多的内存。所以,除非经过线上验证,利用享元模式真的可以大大节省内存,否则,不要过度使用这个模式,为了一点点内存的节省而引入一个复杂的设计模式,得不偿失
-------------------- 本文结束感谢您的阅读 --------------------