当前位置: 首页 > news >正文

Java 设计模式之享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 是一种 结构型设计模式,旨在通过共享对象来有效支持大量细粒度对象的复用,从而减少内存占用和提高性能。其核心是 分离内部状态(可共享)与外部状态(不可共享),适用于存在大量重复对象且对象的大部分状态可以外部化的场景。

1. 核心角色

角色说明
享元接口(Flyweight)定义对象的方法,通常包含接收外部状态的操作。
具体享元类(Concrete Flyweight)实现享元接口,存储内部状态(可共享部分)。
享元工厂(Flyweight Factory)管理享元对象池,确保相同内部状态的对象唯一。
客户端(Client)维护外部状态,通过享元工厂获取对象并传递外部状态。

2. 代码示例:图形编辑器中的树对象

假设需要绘制大量树(Tree)对象,树的类型(名称、颜色)可共享,位置和年龄为外部状态。

步骤1:定义享元接口
步骤2:实现具体享元类
步骤3:实现享元工厂
步骤4:客户端使用
输出结果

3. 享元模式类图

4. 享元模式优缺点

优点缺点
减少内存占用,提升性能。增加系统复杂度(需分离内外部状态)。
支持大量细粒度对象的高效管理。线程安全问题需额外处理(如工厂类)。

5. 内部状态 vs. 外部状态

状态类型说明
内部状态(Intrinsic)对象可共享的部分,独立于使用场景(如树的类型、颜色)。
外部状态(Extrinsic)对象不可共享的部分,随上下文变化(如树的位置、年龄)。

6. 实际应用场景

  1. 文本编辑器

    • 内部状态:字符的字体、颜色、大小。

    • 外部状态:字符在文档中的位置。

  2. 游戏开发

    • 内部状态:子弹类型、纹理。

    • 外部状态:子弹的位置、速度。

  3. Java 字符串池

    • String 类的常量池是享元模式的典型实现,相同字面量的字符串对象被复用。


7. 享元模式 vs. 其他模式

模式区别
单例模式单例确保全局唯一实例;享元允许存在多个实例,但相同内部状态的实例被共享。
对象池模式对象池复用对象生命周期;享元复用对象内部状态。

8. 总结

  • 核心思想:通过共享内部状态减少对象数量,外部状态由客户端传递。

  • 关键实现:享元工厂管理共享对象池,确保唯一性。

  • 适用场景:存在大量相似对象且内存占用是瓶颈时优先考虑。

http://www.dtcms.com/a/73796.html

相关文章:

  • error:0308010C:digital envelope routines::unsupported
  • 推理大模型的后训练增强技术-Reasoning模型也进化到2.0了,这次居然学会用工具了
  • 基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等
  • I2C 总线协议
  • 1.6 极限存在准则
  • python-数据结构汇总,树图、代码讲解(字符串、数组、字典、集合、元组)
  • JavaScript运算符与流程控制详解
  • 【每日学点HarmonyOS Next知识】上下拉列表、停止无限循环动画、页面列表跟随列表滑动、otf字体、日期选择
  • C语言修饰符汇总详解
  • 4.数据结构-树和二叉树
  • VLLM专题(二十六)—使用 Docker
  • 使用HTML+JavaScript生成一个贪吃蛇游戏-demo
  • 案例5_1:单位数码管显示0
  • ERC-6909 最小多代币标准
  • 2000-2023年各地级市二氧化碳排放量数据/地级市CO2排放量
  • 高数1.4 无穷小与无穷大
  • React-state响应式内部数据(类组件Hook两种方式整理)
  • Infura 简介
  • 英文LaTeX中左右引号怎么打
  • Unet nn-Unet
  • 【动手学深度学习】简单多层感知机实现图像分类处理
  • linux 常用命令及命令作用
  • 驱动通信封装
  • 【VUE】ant design vue实现表格table上下拖拽排序
  • Node.js框架Express、Koa、Koa2、Egg 和 NestJS 的对比分析
  • 4张图,9个方法,搞定 “信贷风控策略调优”
  • 在vue项目中,使用Patch请求,实现根据id修改某张发票的日结状态
  • 【前端】入门基础(二)格式化标签、img标签
  • 【免费】2004-2017年各地级市进出口总额数据
  • 单片机外设快速入门篇(六)——中断篇