【重温设计模式】享元模式及其Java示例

享元模式的介绍

在编程世界中,我们常常面临着如何有效管理系统资源的挑战。这就好比我们在生活中,面对有限的物质资源,如何做到既满足需求又节约使用,是一门艺术。在设计模式中,有一种模式,恰如其分地解决了这个问题,那就是享元模式。

享元模式,源自英文Flyweight Pattern,是一种用于性能优化的模式,其核心思想是共享对象,以减少系统中对象的数量,从而减少系统内存的使用,提高系统的性能。这种模式的名称来源于国际象棋中的棋子,棋子虽然有多个,但其本质上的属性都是相同的,只是位置不同,这就是享元模式的精髓。

在享元模式中,有两种状态,一种是内部状态,一种是外部状态。内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变;而外部状态则是对象依赖的一个标记,是随环境改变而改变的、不可以共享的状态。享元模式就是区分这两种状态,将内部状态和外部状态分离,使得我们可以共享相同的内部状态,减少系统中对象的数量。

下面我们将通过一个Java实例,详细讲解如何在Java中实现享元模式,以及实例中的关键代码和技术要点。

享元模式的Java实例

在我们刚刚了解了享元模式的基本概念和特点之后,让我们通过一个具体的Java实例来详细了解如何在Java中实现享元模式。在这个例子中,我们将创建一个名为OneMore的类,它将被设计为享元对象。在这个类中,我们将定义一些内部状态和外部状态,内部状态是共享的,外部状态是由客户端传入的。

首先,我们定义OneMore类,这个类将实现Flyweight接口。在这个类中,我们定义了一个String类型的内部状态intrinsicState,并提供了一个operation方法,这个方法接受一个外部状态作为参数。

public class OneMore implements Flyweight {private String intrinsicState;public OneMore(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void operation(String extrinsicState) {System.out.println("Intrinsic State = " + this.intrinsicState);System.out.println("Extrinsic State = " + extrinsicState);}
}

然后,我们创建一个享元工厂FlyweightFactory,这个工厂负责创建和管理享元对象。在这个工厂类中,我们使用一个HashMap来存储享元对象,当客户端请求一个享元对象时,工厂首先检查这个对象是否已经存在,如果存在,就直接返回这个对象,如果不存在,就创建一个新的对象并加入到HashMap中。

public class FlyweightFactory {private Map<String, Flyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(String key) {Flyweight flyweight = flyweights.get(key);if (flyweight == null) {flyweight = new OneMore(key);flyweights.put(key, flyweight);}return flyweight;}
}

以上就是我们的Java实例,通过这个例子,我们可以看到享元模式在Java中的具体实现方式,以及关键的代码和技术要点。但是,享元模式并不是万能的,它也有自己的优点和缺点,下面我们就来详细分析一下享元模式的优缺点,以及在使用过程中需要注意的问题。

享元模式的优缺点

享元模式最大的优点就是节省内存。当我们在开发大型应用程序时,可能会有大量的重复对象,这时候,如果我们能够复用这些对象,就可以大大减少内存的使用。如果类的实例化过程可能非常复杂,需要消耗大量的资源。这时候,如果我们能够复用这个对象,就可以节省大量的资源。

然而,享元模式也有它的缺点。最大的缺点就是复用对象可能会导致对象状态的管理变得复杂。因为我们复用的是同一个对象,所以,当一个地方改变了对象的状态,其他地方也会受到影响。

在使用享元模式时,我们需要注意一些问题。首先,我们需要确保对象的状态可以被外部控制,也就是说,对象本身不应该有任何状态。其次,我们需要确保对象的创建和销毁成本高于复用成本。

享元模式在实际开发中的应用场景非常广泛。比如,在游戏开发中,我们可能需要创建大量的游戏角色,这时候,如果我们能够复用游戏角色的对象,就可以大大减少内存的使用。再比如,在文本编辑器中,我们可能需要创建大量的字符对象,这时候,如果我们能够复用字符对象,也可以节省大量的内存。

总的来说,享元模式适用于那些需要大量重复对象,且对象的创建和销毁成本高于复用成本的场景。然而,我们在使用享元模式时,也需要注意对象状态的管理问题。

总结

享元模式,这个在编程世界中的节约者,它就像一位精打细算的主妇,用最少的资源,做出最大的效益。它的存在,让我们的系统更加高效,更加省资源,它的智慧,让我们在面对有限的资源时,也能做出最优的选择。

然而,享元模式并非万能,它也有其局限性。在复用对象的同时,我们必须要管理好对象的状态,确保对象的状态不会因为复用而混乱。我们必须要有足够的理由去使用它,那就是对象的创建和销毁成本必须高于复用成本。否则,盲目使用享元模式,反而会带来更大的麻烦。

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

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

相关文章

YOLOv6、YOLOv7、YOLOv8网络结构图(清晰版)

承接上一篇博客&#xff1a;YOLOv3、YOLOv4、YOLOv5、YOLOx的网络结构图(清晰版)_yolox网络结构图-CSDN博客 1. YOLOv6网络结构图 2. YOLOv7网络结构图 3. YOLOv8网络结构图

接口测试(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大多数人对于接口测试都觉得是一种高大上的测试&#xff0c;觉得…

springcloud:3.1介绍雪崩和Resilience4j

灾难性雪崩效应 简介 服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 原因 1.服务提供者不可用(硬件故障、程序bug、缓存击穿、用户大量请求) 2.重试加大流量(用户重试,代码逻辑重试) 3.服…

【QT+QGIS跨平台编译】之六十二:【QGIS_CORE跨平台编译】—【错误处理:未定义类型QgsPolymorphicRelation】

文章目录 一、未定义类型QgsPolymorphicRelation二、解决办法一、未定义类型QgsPolymorphicRelation 报错信息: 错误原因为,使用了未定义类型 QgsPolymorphicRelation 二、解决办法 QgsRelation.h文件中 ①注释第36行: //class QgsPolymorphicRelation;②注释第414行: …

Linux使用基础命令

1.常用系统工作命令 (1).用echo命令查看SHELL变量的值 qiangziqiangzi-virtual-machine:~$ echo $SHELL /bin/bash(2).查看本机主机名 qiangziqiangzi-virtual-machine:~$ echo $HOSTNAME qiangzi-virtual-machine (3).date命令用于显示/设置系统的时间或日期 qiangziqian…

centos无法输入拼音

centos默认是没有拼音输入法的&#xff0c;这里需要设置一下 解决方法&#xff1a; 使用长按win点击空格进行切换&#xff0c;当然&#xff0c;如果就俩输入方式的话直接两个一起按丝滑切换就行了 当然一般情况下我们只需要中文拼音和英文输入两种即可&#xff0c;所以可以删掉…

南京师范大学计电院数据结构课设——排序算法

1 排序算法 1.1 题目要求 编程实现希尔、快速、堆排序、归并排序算法。要求首先随机产生10000个数据存入磁盘文件&#xff0c;然后读入数据文件&#xff0c;分别采用不同的排序方法进行排序并将结果存入文件中。 1.2 算法思想描述 1.2.1 随机数生成 当需要生成一系列随机数…

想要调用淘宝开放平台API,没有申请应用怎么办?

用淘宝自定义API接口可以访问淘宝开放平台API。 custom-自定义API操作 taobao.custom 公共参数 注册账号获取API请求地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xf…

高级统计方法 第5次作业

作业评阅&#xff1a; 概念 1.问题 2.问题&#xff08;略&#xff09; 4.问题&#xff08;略&#xff09; &#xff08;a&#xff09;问题&#xff08;略&#xff09; 10%&#xff0c;忽略 X < 0.05和 X > 0.95的情况。 &#xff08;b&#xff09;问题&#xff08;略…

【数学建模获奖经验】2023第八届数维杯数学建模:华中科技大学本科组创新奖获奖分享

2024年第九届数维杯大学生数学建模挑战赛将于&#xff1a;2024年5月10日08:00-5月13日09:00举行&#xff0c;近期同学们都开始陆续进入了备赛阶段&#xff0c;今天我们就一起来看看上一届优秀的创新奖选手都有什么获奖感言吧~希望能帮到更多热爱数学建模的同学。据说点赞的大佬…

Golang 调度器 GPM模型

Golang 调度器 GPM模型 1 多进程/线程时代有了调度器需求 在多进程/多线程的操作系统中&#xff0c;就解决了阻塞的问题&#xff0c;因为一个进程阻塞cpu可以立刻切换到其他进程中去执行&#xff0c;而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片。这…

cv_bridge连接自定义版本的opencv

在ros noetic版本中&#xff0c;默认的cv_bridge依赖的opencv版本为4.2.0&#xff0c;若要升级opencv版本&#xff0c;则无法使用cv_bridge&#xff0c;所以需要重新自编译cv_bridge。 一. 编译cv_bridge 1.通过网站 https://github.com/ros-perception/vision_opencv/tree/n…