什么是享元模式,有哪些具体应用

一、定义

享元模式是一种通过尽可能多地共享数据来最小化内存使用和对象数量,从而提高性能的设计模式。在享元模式中,如果需要相同数据的多个对象,则共享这些对象而不是创建新的对象,从而提高系统的效率。
其实有很多应用场景,我们日常经常能接触到,但是很多人并不知道这其实是享元模式,如:
字符串池:在Java中, String对象使用了享元模式,通过字符串池的方式共享相同的字符串对象,避免了重复创建。
其实,很多池化技术,如数据库连接池、线程池等,背后都是采用了享元模式来共享对象的。.
在服务器端开发中,享元模式也经常被使用,可以用来管理网络连接,避免资源的浪费。
 

二、举例

假设我们正在编写一个简单的游戏,这个游戏需要绘制很多小怪兽,每个小怪兽有不同的颜色、形状和属性。为了避免创建太多的怪兽对象占用过多的内存,我们可以使用享元模式来实现。


首先,我们创建一个抽象的怪兽类Monster,包含所有怪兽共有的属性和方法,例如draw()方法来绘制怪兽。

然后,我们创建具体的怪兽类,例如红色怪兽、蓝色怪兽、方形怪兽、圆形怪兽等。这些怪兽类继承自Monster类,并在构造方法中初始化它们特有的属性,例如颜色和形状

接下来,我们创建一个工厂 类MonsterFactory来管理怪兽对象的创建和共享。工厂类维护一个个HashMap对象,用来存储已经创建的怪兽对象。在获取怪兽对象时,如果该对象已经存在,直接返回已有的对象,否则创建一个新的对 象并将其存储到HashMap中。这样,我们就可以确保每种属性的怪兽只创建一次, 从而实现共享。

这样,我们就可以在游戏中随意创建各种类型的怪兽,但是实际上每个怪兽只会被创建一次,避免了过多的内存占用。
 


 

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

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

相关文章

软件设计师——软件工程基础知识

软件工程基础知识 软件过程软件过程模型软件测试方法进度管理软件复杂性度量环路复杂度耦合聚合和组合 软件过程 软件过程模型 软件测试方法 黑盒测试和白盒测试 白盒测试中,语句覆盖对程序执行逻辑的覆盖很低,因此一般认为它是很弱的逻辑覆盖。 进度管…

全新视频剪辑软件会声会影2024

会声会影 (CyberLink PowerDirector) 是一款既强大又易于使用的视频编辑软件,具有众多功能和工具,专为用户设计制作高质量的视频剪辑和制作。无论您是一个新手或是一个有经验的电影制作者,会声会影都适合您的需要。 生活即电影 下载地址&…

了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要…

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…

SpringBoot多模块项目整合Shiro报错No bean of type ‘org.apache.shiro.realm.Realm‘ found.

环境 依赖版本 spring-boot-dependencies 2.7.6 shiro-spring-boot 1.13.0 问题 项目启动报错 *************************** APPLICATION FAILED TO START ***************************Description:No bean of type org.apache.shiro.realm.Realm found.Action:Please …

SecureCRT日志记录的7个经典配置记录与14个环境变量(%Y-%M-%D_%H_%S_session.log %t )

每次更换电脑、主机或者环境都需要配置一遍SecureCRT的参数。感觉就最近十年都已经设置过上百次了。其实设置没什么特别的&#xff0c;只是经过不断地打磨&#xff0c;主打的就是一个经济实用。经常忘记&#xff0c;特此记录。 配置方式 建议直接配置默认session&#xff1a;…

如何正确使用数字化仪前端信号调理?(一)

一、前言 板卡式的数字转换器和类似测量仪器&#xff0c;比如图1所示的德思特TS-M4i系列&#xff0c;都需要为各种各样的特性信号与内部模数转换器&#xff08;ADC&#xff09;的固定输入范围做匹配。 图1&#xff1a;德思特TS-M4i系列高速数字化仪&#xff0c;包括2或4通道版…

系统架构最佳实践 -- CRM会员客户关系管理系统架构的设计

在现代商业中&#xff0c;企业与客户之间的关系至关重要。为了更好地管理和维护客户关系&#xff0c;许多企业采用CRM&#xff08;Customer Relationship Management&#xff09;系统。本篇博客将介绍CRM会员客户关系管理系统的架构设计及实践&#xff0c;探讨其核心组成和关键…

MySQL limit N offset M 速度慢?来实际体验下

直接开始 有一张表&#xff1a;trade_user&#xff0c;表结构如下&#xff1a; mysql> desc trade_user; ------------------------------------------------------------------ | Field | Type | Null | Key | Default | Extra | -------------…

第十届蓝桥杯省赛真题(C/C++大学B组)

目录 试题 A: 组队 试题 B: 年号字串 试题 C: 数列求值 试题 D: 数的分解 试题 E: 迷宫 试题 F: 特别数的和 试题 G&#xff1a;完全二叉树的权值 试题 H&#xff1a;等差数列 试题 I&#xff1a;后缀表达式&#xff08;不一定对&#xff09; 试题 J&#xff1a;灵能…

数据库的事务的并发问题和四种隔离级别

1. 数据并发问题 MySQL是一个客户端/服务器架构的软件&#xff0c;可以有若干个客户端与之连接&#xff0c;连接上之后&#xff0c;就可以称之为一个会话&#xff08;Session&#xff09;&#xff0c;对于服务器来说可能同时处理多个Session&#xff0c;也就是对服务器来说可能…

element-ui中el-radio-group组件绑定点击事件触发多次的解决办法

1、需求 电商首页需求&#xff0c;需要做个单选框&#xff0c;然后点击选中切换图标方向及更换价格升倒序&#xff0c;如下图&#xff1a; 从官网文档看&#xff0c;单选框支持change event&#xff0c;使用click加载按钮处不会触发选中 但是使用 click.native 事件不做处理…

LeetCode 2924.找到冠军 II:脑筋急转弯——只关心入度

【LetMeFly】2924.找到冠军 II&#xff1a;脑筋急转弯——只关心入度 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-champion-ii/ 一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。每支队伍也是 有向无环图&#xff08;DAG&#xff09; 上的一个节…

The C programming language (second edition,KR) exercise(CHAPTER 2)

E x c e r c i s e 2 − 1 Excercise\quad 2-1 Excercise2−1&#xff1a;输出结果如图1和图2所示&#xff0c;这道练习题需要文章1和文章2的知识。 #include <stdio.h> #include <limits.h>float getFloat(char sign, unsigned char exp, unsigned mantissa); do…

【Django开发】0到1美多商城项目md教程第7篇:登录,1. 互联开发者申请步骤【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

216. 组合总和 III 思路&#xff1a; 本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。 相对于 77. 组合&#xff0c;无非就是多了一个限制&#xff0c;本题是要找到和为n的k个数的组合&#xff0c;而整个集合已经是固定的了[1,...,9]。 本题k相当于树的深…

vue列表列表过滤

对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤) 编写案例 通过案例来演示说明 效果就是这样的 输入框是模糊查询 想要实现功能&#xff0c;其实就两大步&#xff0c;1获取输入框内容 2根据输入内容进行数据过滤 绑定收集数据 我们可以使用v-model去双向绑定 …

Java 使用 ant.jar 执行 SQL 脚本文件

Java 使用 ant.jar 执行 SQL 脚本文件&#xff0c;很简单。 在 pom.xml 中导入 ant 依赖 <dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.11</version> </dependency>sql 脚本文件…

【2024】使用Rancher管理k8s集群和创建k8s集群

Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…

c++修炼之路之vector模拟实现

目录 前言&#xff1a; 一&#xff1a;在STL的开源代码中的vector的实现 二&#xff1a;模拟实现 1.数据成员size()capacity() 2.resizereserve 3.构造函数析构函数赋值重载 4.迭代器[] 5.push_backinserterase迭代器失效问题 三&#xff1a;测试用例和全部代码 接下…