【重温设计模式】享元模式及其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;
    }

    @Override
    public 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中的具体实现方式,以及关键的代码和技术要点。但是,享元模式并不是万能的,它也有自己的优点和缺点,下面我们就来详细分析一下享元模式的优缺点,以及在使用过程中需要注意的问题。

享元模式的优缺点

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

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

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

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

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

总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VR转接器:破解虚拟与现实边界的革命性设备

VR转接器&#xff0c;这一革命性的设备&#xff0c;为虚拟现实体验带来了前所未有的自由度。它巧妙地连接了虚拟与现实&#xff0c;使得用户在享受VR眼镜带来的奇幻世界的同时&#xff0c;也能自由地在现实世界中活动。这一设计的诞生&#xff0c;不仅解决了VR眼镜续航的瓶颈问…

MySQL进阶之(三)InnoDB数据存储结构之数据页结构

三、InnoDB数据存储结构之数据页结构 3.1 数据库的存储结构3.1.1 MySQL 数据存储目录3.1.2 页的引入3.1.3 页的概述3.1.4 页的上层结构 3.2 数据页结构3.2.1 文件头和文件尾01、File Header&#xff08;文件头部&#xff09;02、File Trailer&#xff08;文件尾部&#xff09; …

比小鹏、问界都贵,谁给了理想MEGA勇气?

“规模小的时候&#xff0c;一号位善于解题。规模大的时候&#xff0c;一号位要善于出题。” 前不久&#xff0c;理想汽车CEO李想在微博上如此评价一家公司中&#xff0c;老板应该怎么做。 现在&#xff0c;成立近9年的理想汽车做出了一个“违背祖宗”的决定——大举进军纯电…

陶瓷工业5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

陶瓷工业5G智能制造工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。在陶瓷工业领域&#xff0c;5G智能制造工厂数字孪生可视化平台的应用正在改变着行业的传统生产模式&#xff0c;推动着数字化转型的进程。本文将围绕这一主题展开探讨&#xff0c;分析数字孪生可视化…

挑战30天学完Python:Day25 pandas

&#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点知识&#xff0c;但又没…

智能家居控制系统(51单片机)

smart_home_control_system 51单片机课设&#xff0c;智能家居控制系统 使用及转载请标明出处&#xff08;最好点个赞及star哈哈&#xff09; Github地址&#xff0c;带有PPT及流程图 Gitee码云地址&#xff0c;带有PPT及流程图 ​ 以STC89C52为主控芯片&#xff0c;以矩阵键…

KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)

**《KubeSphere平台安装系列》** 【Kubernetes上安装KubeSphere&#xff08;亲测–实操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux单节点部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多节点部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…

云时代【6】—— 镜像 与 容器

云时代【6】—— 镜像 与 容器 四、Docker&#xff08;三&#xff09;镜像 与 容器1. 镜像&#xff08;1&#xff09;定义&#xff08;2&#xff09;相关指令&#xff08;3&#xff09;实战演习镜像容器基本操作离线迁移镜像镜像的压缩与共享 2. 容器&#xff08;1&#xff09;…

【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱

1 基本定义 SG 滤波算法&#xff08;Savitzky - Golay 滤波算法&#xff09;是一种数字信号处理算法&#xff0c;用于对信号进行平滑处理。该算法利用最小二乘法拟合局部数据段&#xff0c;然后用拟合的函数来估计每个数据点的值&#xff0c;从而实现平滑处理。 SG 滤波算法的…

【MySQL】表的内连和外连(重点)

表的连接分为内连和外连。 一、内连接 内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选&#xff0c;前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件; 注意&…

计算机毕业设计分享-ssm心理咨询预约管理系统 19086(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

本科生毕业设计&#xff08;论文&#xff09; 题 目心理咨询预约管理系统的设计与实现 学 院 XXXXX 专业班级 XXXXX 学生姓名 XXXX 指导岗位 XXXX 撰写日期&#xff1a;2023年4月 目 录 摘要 1 绪论 1.1背景及意义 …

输入一个整数,输出其最长连续因子。

输入一个整数&#xff0c;输出其最长连续因子。 例如 输入&#xff1a;60 输出&#xff1a;2 3 4 5 6 注意&#xff1a;1不算因子 输入输出格式 输入描述: 输入一个整数N&#xff0c;N<10000。 输出描述: 输出其最长连续因子&#xff0c;如果有多个最长&#xff0c;输出…

Linux篇: 进程控制

一、进程创建 1.1 fork函数初识 在Linux中&#xff0c;fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a; 在子进程中返回0&#xff0c;父进程中返回子进程的PID&#xff0c;子进程创…

#WEB前端

1.实验&#xff1a;vscode安装&#xff0c;及HTML常用文本标签 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; &#xff08;1&#xff09;网页直接搜索安装vscode &#xff08;2&#xff09;打开vscode&#xff0c;在下图分别安装以下插件&#xff1a; Html Css Support …

PowerDesigner中怎么给ER图中字段设置默认值

双击table&#xff0c;进入数据库表详情页 详情页点击【Columns】 双击你要设置默认值得栏目&#xff0c;例如我得删除标记 点击【Standard Checks】&#xff0c;在【Defalut】中录入你想要得默认值&#xff0c;点击【应用即可】

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本&#xff08;谨慎更新&#xff09; 如果升级驱动出现问题&#xff0c;重启驱动软件后会默认让你恢复的。 …

【Vue】更换浏览器默认 logo

更换浏览器默认logo为自定义图片 一. 浏览器默认 logo二. 替换为自定义logo三. 步骤3.1 转换大小3.1.1 查看图片尺寸3.1.2 修改尺寸&#xff08;为32px 32px&#xff09; 3.2 替换成功 一. 浏览器默认 logo 二. 替换为自定义logo 三. 步骤 3.1 转换大小 将自定义 logo 转为323…

AcWing 788. 逆序对的数量 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a; 788. 逆序对的数量 - AcWing题库https://www.acwing.com/problem/content/790/ 这题也是板子题&#xff0c;就是对归并排序的衍生&#xff0c;我们先分析下如果用归并排序对排序区间进行二分的话&#xff0c;逆序对可能出现的…

[计算机网络]--五种IO模型和select

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、五种IO…

Selenium 遇见伪元素该如何处理?

问题发生 在很多前端页面中&#xff0c;大家会见到很多&#xff1a;:before、::after 元素&#xff0c;比如【百度流量研究院】&#xff1a; 比如【百度疫情大数据平台】&#xff1a; 以【百度疫情大数据平台】为例&#xff0c;“累计确诊”文本并没有显示在 HTML 源代码中&am…