专栏首页大闲人柴毛毛三分钟理解“享元模式”——设计模式轻松掌握

三分钟理解“享元模式”——设计模式轻松掌握

享原模式的官方定义:

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

大白话讲:

一个类它可能生成好多对象,但这些对象根据属性值的不同一共分成N类,每种类型中属性值都是一样的。在这种情况下,如果创建好多对象,那么这些对象中很多属性值都是重复的,从而造成了大量的内存浪费。

而享元模式能够解决重复对象的内存浪费的问题。

享元模式使用一个工厂类,在工厂类中为每种类型创建一个对象,而且每种类型的对象只有一个。

当客户端需要某种类型的对象的时候,工厂将已创建好的对象给客户端。由于不创建新的对象了,所以节省了内存。

享元模式的类图:

客户端通过Factory.getFlyweight(key)来获取指定类型的Flyweight对象。

但这样有一个问题,有时候指定类型的对象中的某几个属性值可能不同,如果通过工厂获得的对象,由于他们都是统一个对象,因此他们的属性值都是完全一样的,这时就需要将属性值不一样的属性存在外部对象中,外部对象作为参数传递给Flyweight的函数,这些函数在执行过程中当遇到特殊属性的时候就会调用外部对象中的值。类图如下:

这里的User就是用于存储特殊值的外部类,在Flyweight类中需要用到属性特殊值的函数都需要将含有特殊属性值的外部类对象作为参数传递进来。

外部状态与内部状态:

在享元对象中,不会随环境变化而变化的共享属性称为享元的内部状态;

而随着环境变化而变化的,不可以共享的状态就是享元的外部状态。

何时使用?

享元模式可以避免大量非常相似的对象的开销。

在程序设计中,如果发现需要大量细粒度的类对象来表示数据,而且这些类除了几个参数不同以外,其他的属性都是相同的,这时候就可以使用享元模式。类中相同的属性可以通过工厂类来共享,这些属性就是享元类的内部状态;而那些会变化的属性放在新建的外部对象中,作为参数传递给享元类的函数。

享元模式的优点:

享元模式通过共享对象的方式,把所有对象的公共属性存放在同一个对象中,不同的属性存放在外部类中,从而起到了节省存储空间的作用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入理解JVM(二)——揭开HotSpot对象创建的奥秘

    对象的创建过程 当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作: 检查常量池中是否有即将要创建的这个对象所属的类的符号引用; 若常量池中没...

    大闲人柴毛毛
  • 深入JVM——OOM异常解析

    JVM对象访问解析 对象访问过程的内存情况 public void function(){ Object obj = new Object(); } f...

    大闲人柴毛毛
  • 深入剖析Spring(四)——AOP

    AOP思想 AOP是对OOP的一种补充。 面向对象(OOP)引入了继承、多态、封装,将系统的业务功能按照模块划分,每个模块用一个或多个类来表示。 而对于一些系...

    大闲人柴毛毛
  • VBA对象属性概述

    上节概述了对象模型的基础知识,而对象的学习重点其实就是它们的属性和方法,不同对象都有诸多不同的属性和方法,后期将从常用对象的属性和方法循序渐进的展开。

    无言之月
  • Application主程序对象基础

    大家好,前面已经介绍了常见的几种VBA对象,包括range单元格对象、worksheet工作表对象和workbook工作簿对象。本节介绍Application主...

    无言之月
  • JS基础测试: typeof delete window.name 的返回结果是什么?​

    delete 操作符用于删除对象的某个属性;如果没有指向这个属性的引用,那它最终会被释放。

    舒克
  • JavaScript | 获取数组中的单词并统计出现次数

    HTML5学堂(码匠):如何通过JavaScrip实现数组元素的查找?在一个数组当中,找到所有的单词,并统计每个单词出现的次数。 功能需求 在一个自定义数组...

    HTML5学堂
  • 深入理解javascript中的继承机制(3)属性复制对象之间的继承深复制原型继承原型继承与属性复制的混合使用

    我们开始换一种思路实现继承,可不可以直接将父对象的属性直接复制给子对象,这样子对象不久也拥有了父对象的属性,相当于继承。

    desperate633
  • PHP面向对象基础总结

    近来参加了几场PHP工程师的面试,但是笔试题答得都不理想,回来总结了一下失败的原因,是没看PHP手册。几家公司的PHP基础面试题都可以在PHP手册上找到。哎,...

    用户7657330
  • Jsp内置对象及EL表达式的使用

    一、JSP的内置对象(9个JSP内置对象) JSP的内置对象引用名称   对应的类型 request          HttpServletReques...

    欠扁的小篮子

扫码关注云+社区

领取腾讯云代金券