享元模式的定义

定义: 使用共享对象可有效的支持大量的细粒度的对象

通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果

上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态

  1. 内部状态是对象可以共享出来的信息, 存储在享元对象内部并且不会随环境改变而改变. 如一个报考系统中的个人信息.
  2. 外部状态时对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态. 如报考系统中的报考科目. 享元模式通常以外部状态为参考来限制对象产生数量

说白了,内部状态就是每个对象都不同的属性,外部状态就是数量有限的属性, 如性别只有男女等

享元模式的类图如下:

其中的角色:

  1. Flyweight 抽象享元角色: 简单地说就是一个产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
  2. ConcreteFlyweight 具体享元角色: 具体的一个产品类, 实现抽象角色定义的业务. 该角色需要注意的是内部状态处理应该与环境无关,不应该初恋一个操作改变了内部状态,同时修改了外部状态, 这是角色不允许的
  3. FlyweightFactory 享元工厂: 职责非常简单, 就是构造一个池容器,同时提供从池中获得对象的方法

享元模式的目的在于运用共享技术,使得一些细粒度的对象可以共享

抽象享元角色代码:

抽象享元角色一般为抽象类,在实际项目中一般是一个实现类, 它是描述一类事物的方法.在抽象角色中,一般需把外部状态和内部状态定义出来,避免子类的随意扩展. 我们对外部状态加上了final关键字, 防止意外发生.获得外部状态, 无意修改了一下, 池就混乱了.

在程序开发中, 确认只需要一次赋值的属性则设置为final类型,避免无意修改导致逻辑混乱.

具体享元角色代码:

享元工厂代码:

享元模式的应用

享元模式的优点和缺点:

享元模式是一个非常简单的模式, 它可以大大减少应用程序创建的对象,减低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态, 而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱

享元模式的使用场景:

  1. 系统中存在大量的相似对象
  2. 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
  3. 需要缓冲池的场景

享元模式的扩展

1.线程安全的问题

当使用享元模式时, 对象池中的角色数量是一定的, 可能在拿的时候不同线程同时拿到同一个对象.这是就出现线程不安全的问题了

我们在使用享元模式时要注意这个问题. 我们在使用享元模式时,对象池中的享元对象尽量多, 多到足够满足业务为止

2.性能平衡

既然是面向对象编程, 我们何不将外部状态抽离出来,定义为一个对象呢?

经过测试, 外部状态使用对象要比使用基本类型效率低. 所以, 外部状态最好以Java的基本类型作为标志, 如stirng、int等, 可以大幅的提升效率


享元模式在Java API中也是随处可见. 如Java的String就实现了对象池

需要说明一下的是,虽然可以使用享元模式实现对象池, 但是这两者还是有比较大的差异, 对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得的A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式主要解决对象的共享问题,如何建立多个可共享的细粒度对象是其关注的重点.

23种设计模式之享元模式相关推荐

  1. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

  2. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  3. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  4. 详解设计模式:享元模式

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

  5. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

  6. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  7. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

  8. 【设计模式】享元模式(C#)

    [设计模式]享元模式 1.概述 Flyweight Design Pattern,结构型模式.享元模式中的"享元"指被共享的单元.享元模式通过复用对象,以达到节省内存的目的. 用于 ...

  9. 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...

最新文章

  1. java整数转二进制字符串_在Java中将int转换为二进制字符串表示形式?
  2. 评估应用使用oracle磁盘空间,Oracle磁盘空间使用统计
  3. Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建
  4. 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)
  5. 数学国里有座天才云集的“疯人院”
  6. python3.6,--登录知乎
  7. 1,Django 基础一
  8. Unity3D脚印6——模型动画
  9. oracle job 与存储过程,讲解Oracle中JOB与存储过程的接合用法
  10. drools rule (二) LHS语法详解
  11. python2升级python3
  12. 数论二·Eular质数筛法
  13. 【python】蔡勒公式计算日期
  14. CC2530基础实验二 外部中断实验
  15. html4角星,运用ai绘画出5角星4角星三角形形状的设置步骤
  16. 侯世达:让机器学习思考的人
  17. 渔夫与商人的故事:人的一生到底在追求什么
  18. 护眼台灯哪种光源好?光源最舒适的护眼台灯推荐
  19. Qt(C++)调用工业相机Basler的SDK使用示例
  20. 前端接收java验证码_在Web项目中手机短信验证码实现的全过程记录

热门文章

  1. C语言学习及应用笔记之四:C语言volatile关键字及其使用
  2. 多元相关性分析_研究 | 精神分裂症症状与超氧化物歧化酶相关性的性别差异
  3. ab plc编程软件_三菱PLC原装和高仿怎么区分?仿真和编程软件一样吗?
  4. mfc color 亮度_双十一4K投影仪怎么选?小心别掉“亮度坑” - 电视
  5. java编程中的持有对方引用是什么意思?有什么作用?
  6. c语言递归建链表,递归创建二叉树c语言实现+详细解释
  7. 华为usg6000配置手册_带你了解防火墙安全区域的作用及简单的配置,小白不要错过了...
  8. 【LeetCode笔记】1. 两数之和(JAVA、哈希表)
  9. mysql双机数据热备份_配置MySQL数据库双机热备份
  10. k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?