设计模式之 享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少系统中对象的数量,从而节省内存和提升性能。它通过共享相同的对象来避免重复创建类似的对象。该模式尤其适用于对象数量庞大、且重复内容较多的场景。

核心思想:将对象的状态划分为内蕴状态(Intrinsic State)和外蕴状态(Extrinsic State),内蕴状态是可以共享的部分,而外蕴状态则由客户端管理并在需要时动态传递。

一、享元模式的特点

  1. 状态拆分

    • 内蕴状态:对象中可以共享的不变部分,由享元对象内部存储。
    • 外蕴状态:对象中可变的部分,不存储在享元对象中,由客户端动态提供。
  2. 对象共享

    系统只会为每种内蕴状态创建一个享元对象,并在不同上下文中重复使用这些对象。
  3. 性能优化

    通过共享对象,减少内存开销,提升系统性能。

二、享元模式的结构

享元模式主要包含以下角色:

  1. 抽象享元(Flyweight)

    定义享元对象的公共接口,外部通过该接口与具体享元对象交互。
  2. 具体享元(ConcreteFlyweight)

    实现抽象享元接口,并存储内蕴状态。具体享元对象需要支持可以共享的功能。
  3. 非共享具体享元(UnsharedConcreteFlyweight)

    并非所有的享元对象都需要共享,这些对象不能被多个客户端共享,但也实现了享元接口。
  4. 享元工厂(FlyweightFactory)

    管理享元对象的创建和共享,确保客户端获取的享元对象是唯一的,避免重复创建。
  5. 客户端(Client)

    负责维护外蕴状态,并与享元对象交互。

三、享元模式的工作原理

  1. 客户端通过享元工厂获取享元对象。
  2. 如果享元对象已存在,工厂返回共享对象;如果不存在,则工厂创建新的享元对象。
  3. 客户端将外蕴状态传递给享元对象,享元对象结合其内蕴状态执行操作。

四、享元模式的实现

下面通过一个实例展示享元模式的实现。

示例:棋盘上的棋子

在一个棋盘游戏中,棋子的位置是变化的(外蕴状态),而棋子的颜色(黑/白)是固定的(内蕴状态)。我们可以使用享元模式来优化棋子的管理。

  • 抽象享元类
    public interface ChessPiece {void display(int x, int y);
    }
  • 具体享元类
    public class ConcreteChessPiece implements ChessPiece{private String color;public ConcreteChessPiece(String color){this.color = color;}@Overridepublic void display(int x,int y) {System.out.println("棋子颜色" + color + ",棋子位置:(" + x + "," + y + ")" );}
    }
  • 享元工厂
    public class ChessPieceFactory {private static Map<String,ChessPiece> map = new HashMap<>();public static ChessPiece getChessPiece(String color) {if (!map.containsKey(color)) {map.put(color, new ConcreteChessPiece(color));}return map.get(color);}
    }
    
  • 客户端
    public class Client {public static void main(String[] args) {// 获取共享的棋子ChessPiece black1 = ChessPieceFactory.getChessPiece("黑色");ChessPiece black2 = ChessPieceFactory.getChessPiece("黑色");ChessPiece white1 = ChessPieceFactory.getChessPiece("白色");// 设置外蕴状态(棋子的位置)black1.display(1, 1);black2.display(2, 3);white1.display(4, 5);// 验证共享对象System.out.println("黑色棋子是否相同: " + (black1 == black2));}
    }
  • 运行结果

五、享元模式的优缺点

优点:
  1. 减少内存占用

    通过共享对象,避免了重复的对象实例,大幅度降低系统的内存开销。
  2. 提升性能

    减少对象创建的次数和垃圾回收的频率,提升系统性能。
  3. 适用于大量小对象

    享元模式尤其适合那些数量多、内容重复的对象。
缺点:
  1. 实现复杂

    需要对对象的状态进行拆分,并精心设计共享机制,增加了系统的复杂度。
  2. 不适用所有场景

    如果共享对象的数量过少,或者内蕴状态和外蕴状态之间的界限不清晰,享元模式的优势难以体现。
  3. 增加了客户端的职责

    客户端需要管理外蕴状态,这可能导致客户端代码的复杂度提高。

六、享元模式的应用场景

享元模式适用于以下场景:

  1. 大量相似对象

    系统中存在大量内容重复的对象,且这些对象的部分状态是可以共享的。
  2. 内存优化需求强

    内存占用是系统性能的瓶颈,迫切需要通过共享对象来节省内存。
  3. 不变性场景

    对象的共享部分是不可变的,这样才能安全地在不同上下文中共享。
常见案例:
  • 文本处理:在文本编辑器中,每个字符的字体、颜色等属性可以共享,具体的位置由外部管理。
  • 图形界面:在绘图程序中,重复的图形对象(如线条、圆形)可以共享。
  • 游戏开发:在大型游戏中,地图上的树木、建筑等对象可以共享。
  • 数据库连接池:共享连接对象,避免重复创建连接。

七、享元模式的拓展

  1. 非共享享元

    并非所有对象都适合共享。如果某些对象需要独占使用,则可以通过非共享享元类实现。
  2. 复合享元模式

    组合模式和享元模式结合使用,可以将享元对象组成一个树形结构,从而支持更复杂的共享场景。
  3. 线程安全性

    享元对象通常是不可变的,这样可以在多线程环境中安全共享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476012.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov5 数据集分享:纯干货

数据集分享&#xff1a;纯干货 1. 遇见数据集&#xff1a;这是一个国内的数据集搜索引擎&#xff0c;索引了国内外的大部分网站&#xff0c;提供最新的数据集推荐。[遇见数据集网站](https://www.selectdataset.com/) 2. Kaggle&#xff1a;一个领先的数据科学和机器学习爱好者…

如何实现3D模型在线展示、互动和分享?

实现3D模型在线展示、互动和分享&#xff0c;可以通过多种途径和技术手段来完成。以下是一些具体的方法和步骤&#xff1a; 一、选择适合的3D模型展示平台 首先&#xff0c;你需要选择一个支持3D模型在线展示、互动和分享的平台。这些平台通常提供用户友好的界面和工具&#x…

大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

CANoe录制和回放CAN报文

目录 1、录制报文 2、离线回放 3、在线回放 3.1、在线回放设置 CANoe是一款用于汽车电子测试的工具&#xff0c;它可以模拟CAN网络中的各种设备&#xff0c;并支持CAN报文的录制和回放功能&#xff0c;方便我们远程调试。 1、录制报文 在Measurement Setupk面板点击Loggi…

大数据调度组件之Apache DolphinScheduler

Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 主要特性 易于部署&#xff0c;提供四种部署方式&#xff0c;包括Standalone、Cluster、Docker和…

XCode Build时遇到 .entitlements could not be opened 的问题

遇到错误 在构建成功的XCode工程上&#xff0c;手动打开XCode并Build&#xff0c;遇到以下问题&#xff1a; The file .entitlements could not be opened. Did you forget to declare this file as an output of a script phase or custom build rule which produces it 打…

关于一次开源java spring快速开发平台项目RuoYi部署的记录

关于一次开源java spring快速开发平台项目RuoYi部署的记录 本次因为需要一些练习环境&#xff0c;想要快速搭建一个javaweb 项目作为练习环境&#xff0c;经过查询和实验找到一个文档详细&#xff0c;搭建简单&#xff0c;架构也相对比较新的开源项目RuoYi。 项目介绍&#xf…

原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型

无论是在什么手机机型下&#xff0c;自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12&#xff0c;13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意&#xff1a;红色阔里的是自定义导航&#xff08;或者其他的logo啊&#xff0c;返回之…

列出D3的所有交互方法,并给出示例

D3.js 提供了丰富的交互方法&#xff0c;可以用来增强图表的用户交互体验。以下是一些常用的交互方法及其示例&#xff1a; 1. 鼠标事件 on("mouseover", function) 用途: 当鼠标悬停在元素上时触发。示例:svg.selectAll(".bar").on("mouseover&qu…

小程序-使用 iconfont 图标库报错:Failed to load font

官方默认可以忽略此错误&#xff0c;在清除缓存后首次刷新会显示此错误&#xff0c;重新渲染错误消失 解决方法&#xff1a; 在 iconfont 图标库选择项目设置 选中 Base64 保存&#xff0c;重新点击链接 -> 复制代码到项目中 操作步骤&#xff1a;

[免费]SpringBoot+Vue毕业设计论文管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue毕业设计论文管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue毕业设计论文管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信…

System Control Units (SCU)

本文对Ifx TC3xx的System Control Units (SCU)模块进行介绍&#xff0c;此网页为汇总连接&#xff0c;具体模块见对应超链接。 系统控制单元&#xff08;SCU&#xff09;是一组控制各种系统功能的子模块&#xff0c;包括以下模块&#xff1a; Reset Control (RCU)Trap genera…

网站推广实战案例:杭州翔胜科技有限公司如何为中小企业打开市场大门

以下是以杭州翔胜科技有限公司为例&#xff0c;解析其如何通过网站推广为中小企业打开市场大门的实战案例&#xff1a; 一、一站式网站推广方案 杭州翔胜科技有限公司提供一站式网站推广方案&#xff0c;该方案整合了多种推广手段&#xff0c;如搜索引擎优化&#xff08;SEO&a…

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream&#xff1f; 我看很多回答都是“为了屏蔽消息队列的差异&#xff0c;使我们在使用消息队列的时候能够用统一的一套API&#xff0c;无需关心具体的消息队列实现”。 这样理解是有些不全面的&#xff0c;Spring Cloud Stream的核心是Stream&#xf…

OpenMMlab导出Mask R-CNN模型并用onnxruntime和tensorrt推理

onnxruntime推理 使用mmdeploy导出onnx模型&#xff1a; from mmdeploy.apis import torch2onnx from mmdeploy.backend.sdk.export_info import export2SDKimg demo.JPEG work_dir ./work_dir/onnx/mask_rcnn save_file ./end2end.onnx deploy_cfg mmdeploy/configs/mmd…

【大语言模型】ACL2024论文-19 SportsMetrics: 融合文本和数值数据以理解大型语言模型中的信息融合

【大语言模型】ACL2024论文-19 SportsMetrics: 融合文本和数值数据以理解大型语言模型中的信息融合 https://arxiv.org/pdf/2402.10979 目录 文章目录 【大语言模型】ACL2024论文-19 SportsMetrics: 融合文本和数值数据以理解大型语言模型中的信息融合目录摘要研究背景问题与挑…

39页PDF | 毕马威_数据资产运营白皮书(限免下载)

一、前言 《毕马威数据资产运营白皮书》探讨了数据作为新型生产要素在企业数智化转型中的重要性&#xff0c;提出了数据资产运营的“三要素”&#xff08;组织与意识、流程与规范、平台与工具&#xff09;和“四重奏”&#xff08;数据资产盘点、评估、治理、共享&#xff09;…

【UE5】使用基元数据对材质传参,从而避免新建材质实例

在项目中&#xff0c;经常会遇到这样的需求&#xff1a;多个模型&#xff08;例如 100 个&#xff09;使用相同的材质&#xff0c;但每个模型需要不同的参数设置&#xff0c;比如不同的颜色或随机种子等。 在这种情况下&#xff0c;创建 100 个实例材质不是最佳选择。正确的做…

[STBC]

空时分组编码STBC&#xff08;Space Time Block Coding&#xff09;: //一个数据流通过多个天线发射发送&#xff0c;硬件编码器 STBC概念是从MIMO技术衍生出来的&#xff0c;目的是在多天线系统中提高数据传输的可靠性和传输距离。在rx&#xff08;接收天线&#xff09;和tx&…

241120学习日志——[CSDIY] [InternStudio] 大模型训练营 [09]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…