尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

23种设计模式——享元模式(Flyweight Pattern) - 实践

23种设计模式——享元模式(Flyweight Pattern) - 实践
📅 发布时间:2026/6/19 16:47:01

✅作者简介: Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java手艺内容。就是大家好,我
个人主页:Meteors.的博客
当前专栏:设计模式
✨特色专栏:知识分享
本文内容:23种设计模式——享元模式(Flyweight Pattern)
** ps **  :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 介绍

三. 关键角色

四. 核心思想

五. 应用场景

六. 具体案例

七. 总结


一. 背景

把已创建的元素分享出去,避免相同的元素过多。和内存的缓存类似,就是享元模式,相信很多人都会对它有点陌生。和它的命名类似,它本质上其实就在​​分布式环境、服务之间共享​。那么享元模式就是就是如果说Redis缓存在​​进程内、对象级别共享​。下面会对享元模式进行详细的介绍。


二. 介绍

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

享元模式的通过共享技术来有效地支持大量细粒度对象的复用就是核心思想。它将对象的内部状态和外部状态区分开来,内部状态是对象共享的部分,外部状态是对象独立的部分。
当系统中存在大量相似或完全相同的对象,且这些对象消耗大量内存时,享元模式能够通过共享相同的部分来显著减少内存使用。


三. 主要角色

Flyweight(抽象享元类):定义对象的接口,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。
ConcreteFlyweight(具体享元类):实现抽象享元角色所规定的接口。如果有内部状态,可以在类内部定义。
FlyweightFactory(享元工厂类):负责创建和管理享元角色。当客户端请求一个具体享元角色时,享元工厂角色得检查系统中是否已有一个符合要求的享元角色。如果已经有了,享元工厂角色就应当供应这个已有的享元角色;如果没有,则创建一个合适的享元角色。
Client(客户端):维护对所有享元对象的引用,而且还需要存储对应的外部状态。


四. 核心思想

享元模式的关键是区分内部状态和外部状态:
内部状态(Intrinsic State):在享元对象内部不随外界环境改变而改变的共享部分。
外部状态(Extrinsic State):随环境改变而改变的、不能够共享的状态。


五. 应用场景

通过在下面场景中,能够考虑采用享元模式:

  1. 平台中存在大量相似对象
  2. 对象创建和存储成本较高
  3. 对象可以轻松共享而不影响其外部行为
  4. 系统不依赖于这些对象的身份,这些对象是不可分辨的

到具体的场景中,在下面情况下,我们可以考虑使用享元模式:

  1. 文本编辑器中的字符对象:在处理大量文本时,每个字符许可作为享元对象,字符的字体、大小等作为内部状态,字符在文档中的位置作为外部状态。
  2. 游戏开发中的粒子系统:在游戏特效中,大量的粒子可以共享纹理、模型等内部状态,而位置、速度等作为外部状态。
  3. Java中的String常量池:享元模式的应用,相同内容的字符串在内存中只保存一份。就是Java的String常量池就

六. 具体案例

形状的x/y的坐标:就是下面是一个使用享元模式实现画图的demo,内部状态就是形状的颜色,外部状态

import java.util.HashMap;
import java.util.Map;
// 抽象享元类
interface Shape {void draw(int x, int y);
}
// 具体享元类
class Circle implements Shape {// 内在状态 - 可以共享的属性private String color;public Circle(String color) {this.color = color;System.out.println("创建新的圆形: " + color);}// 外在状态 - 随环境变化,不可共享的属性,由客户端传入@Overridepublic void draw(int x, int y) {System.out.println("绘制圆形 - 颜色: " + color + ", 坐标: (" + x + "," + y + ")");}
}
// 享元工厂类
class ShapeFactory {private static final Map shapeMap = new HashMap<>();public static Shape getCircle(String color) {Shape circle = shapeMap.get(color);if (circle == null) {circle = new Circle(color);shapeMap.put(color, circle);System.out.println("创建新的圆形并放入缓存中: " + color);} else {System.out.println("复用缓存中的圆形: " + color);}return circle;}public static int getShapeCount() {return shapeMap.size();}
}
// 客户端代码
public class FlyweightPatternDemo {private static final String[] colors = {"红色", "绿色", "蓝色", "黄色", "黑色"};public static void main(String[] args) {// 创建大量圆形对象for (int i = 0; i < 20; ++i) {Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());circle.draw(getRandomX(), getRandomY());}System.out.println("总共创建的圆形对象数量: " + ShapeFactory.getShapeCount());}private static String getRandomColor() {return colors[(int) (Math.random() * colors.length)];}private static int getRandomX() {return (int) (Math.random() * 100);}private static int getRandomY() {return (int) (Math.random() * 100);}
}

七. 总结

通俗的说,享元模式通过共享技术来高效地帮助大量细粒度对象的复用,以减少内存应用和提高性能。当我们有多个相似对象,且有部分相同属性时,允许考虑运用享元模式,减少对象数量,共享相同对象以节省内存。

相关新闻

  • 将 Zabbix 的数据导入到 Grafana 中进行可视化
  • 网络工程师必备神器
  • 【C语言】杨辉三角:数学之美与编程建立的完美结合

最新新闻

  • 软件测试基础:黑盒、白盒、灰盒测试
  • 2026年工业工厂吸尘器Top3:Shiwosi史沃斯凭什么第一? - 工业清洁测评社
  • 多智能体系统中的向量化声誉传播机制TrustFlow解析
  • Qwen3vl多模态后训练实战:LLamaFactory深度适配指南
  • 国产MLU算网+LLaMA-Factory:零代码微调百余大模型实战指南
  • 猫抓插件:3步搞定浏览器资源嗅探的终极指南

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号