享元模式介绍

devtools/2025/4/1 5:30:19/

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用和提高性能,特别适用于处理大量相似对象的场景。其核心思想是将对象的内部状态(可共享的部分)和外部状态(不可共享的部分)分离,通过共享内部状态来避免重复创建相似对象。


核心概念

  1. Flyweight(享元接口)
    定义对象可共享的方法,通常包含一个接收外部状态参数的方法。
  2. ConcreteFlyweight(具体享元类)
    实现享元接口,存储内部状态(可共享的部分)。
  3. FlyweightFactory(享元工厂)
    管理享元对象的池(缓存),确保对象被正确共享。
  4. Client(客户端)
    维护外部状态(不可共享的部分),并在调用享元对象时传递外部状态。

应用场景

  • 存在大量相似对象,且这些对象的状态可分离为内部和外部部分。
  • 内存占用高,且大部分对象的内部状态可以共享。
  • 例如:游戏中的粒子系统、文本编辑器中的字符渲染、线程池/连接池等。

框架中的使用案例

1. Java 字符串常量池
  • 机制:Java 通过字符串常量池(String Pool)复用字符串字面量,避免重复创建相同字符串。
  • 享元模式体现:字符串是不可变的(内部状态),相同的字符串字面量指向池中的同一对象。
    String s1 = "hello";  // 从常量池获取
    String s2 = "hello";  // 复用 s1 的对象
    System.out.println(s1 == s2); // true
    
2. Java 包装类的缓存(如 Integer)
  • 机制:Java 对部分值范围(如 -128 到 127)的 Integer 对象进行缓存。
  • 享元模式体现:调用 Integer.valueOf() 时,优先返回缓存对象。
    Integer a = Integer.valueOf(127);  // 从缓存获取
    Integer b = Integer.valueOf(127);  // 复用 a 的对象
    System.out.println(a == b); // true
    
3. GUI 框架中的单元格渲染(如 JavaFX、Swing)
  • 场景:表格或列表中大量单元格的渲染。
  • 享元模式体现:复用单元格渲染器对象,仅更新外部状态(如单元格数据)。
    // 伪代码示例:表格单元格渲染器
    TableCellRenderer renderer = factory.getRenderer("text");
    renderer.render(dataRow, context); // dataRow 是外部状态
    
4. 线程池/数据库连接池
  • 机制:预先创建一组线程或连接对象,避免频繁创建销毁。
  • 享元模式体现:线程/连接对象是内部状态,任务/请求是外部状态。
5. 游戏引擎中的粒子系统
  • 场景:游戏中的爆炸、火焰等粒子效果需要渲染大量相似粒子。
  • 享元模式体现:共享粒子的纹理、颜色等内部状态,仅更新位置、速度等外部状态。
6. Spring 框架中的 Bean 作用域
  • 单例作用域:Spring 默认单例模式的 Bean 被所有请求共享,类似于享元模式
  • 原型作用域:非共享对象,每次请求创建新实例。

优缺点

  • 优点
    • 减少内存占用,提升性能。
    • 集中管理共享状态,避免重复。
  • 缺点
    • 增加系统复杂性(需分离内部/外部状态)。
    • 线程安全问题需谨慎处理。

总结

享元模式通过共享不可变状态优化资源使用,非常适合处理大量相似对象的场景。在框架中,它常见于常量池、连接池、UI 组件复用等场景。使用时需注意状态分离和线程安全。


http://www.ppmy.cn/devtools/172215.html

相关文章

机器学习算

1 KMeans聚类 什么是聚类任务 1 无监督机器学习的一种 2 目标将已有数据根据相似度划分到不同的簇 3 簇内样本彼此之间越相似,不同簇的样本之间越不相似,就越好 为什么叫KMeans聚类 1 也可以叫K均值聚类 2 K是最终簇数量,它是超参数&a…

uvm sequence

UVM Sequence 是验证环境中生成和控制事务(Transaction)流的核心机制,它通过动态生成、随机化和调度事务,实现灵活多样的测试场景。以下是Sequence的详细解析: Sequence 的核心作用 事务流生成:通过 uvm_s…

AWS CloudWatch 实战:构建智能监控与自动化运维体系

摘要:本文通过实际案例,详细讲解如何利用AWS CloudWatch实现云端资源的实时监控、日志分析与自动化运维,助力企业提升系统稳定性与运维效率 一、场景痛点分析 某电商平台迁移至AWS后面临三大挑战: 故障响应滞后:服务器…

基于python+django的图书借阅网站-图书借阅管理系统源码+运行步骤

该系统是基于pythondjango开发的在线图书借阅管理系统。系统适合场景:大学生、课程作业、系统设计、毕业设计。 演示地址 前台地址: http://book.gitapp.cn 后台地址:http://book.gitapp.cn/#/admin 后台管理帐号: 用户名&…

【智能搜索引擎技术】第四章搜索引擎索引构建(水课复习自用)

一、倒排索引基础与结构 1.定义 倒排索引(Inverted Index)是搜索引擎的核心数据结构,主要用于记录文档集中单词与文档之间的映射关系。它的设计目的是为了提高搜索效率,使得搜索引擎能够快速定位包含用户查询词的文档&#xff0…

在使用JupyterNoteBook中下载Pymsql组件时可能遇到的情况

在我们学习数据分析与可视化使用Jupyter的过程中,可能会遇到下图的情况: (base) C:\Users\kinect_user>pip install pymysql Looking in indexes: https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple Collecting pymysql Downloading https://…

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

文章目录 引言I 实现步骤添加商品管理菜单组推拉效果引言 应用场景:PC端管理后台页面,左侧菜单列表导航。 思路: 用到了动态面板的两个交互效果来实现:隐藏/显示切换、展开/收起元件向下I 实现步骤 添加商品管理菜单组 在左侧画布区域添加一个菜单栏矩形框;再添加一个商…

uniapp开发实战自定义组件形式实现自定义海报功能

在 UniApp 中实现自定义海报功能,可以通过 Canvas 来绘制海报。Canvas 提供了丰富的绘图 API,可以精确控制文字、图片和二维码的位置。下面是一个完整的示例,展示如何创建一个自定义海报组件。 项目结构 假设你的项目结构如下: project-root/ ├── pages/ │ └──…