Java设计模式 _结构型模式_享元模式

一、享元模式

1、享元模式
享元模式(Flyweight Pattern)是一种结构型模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。主要解决有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
享元模式通过缓冲池的思路来实现,从而减少大量相同数据的产生,这样的数据要求内部状态不易变化,如游戏中的子弹,象棋中的棋子等。如果内部状态容易发生变化,就会很容器造成线程不安全的问题,这样的场景一般不推荐享元模式。

2、实现思路
(1)、定义享元接口。
(2)、编写实现享元接口的实现类。
(3)、编写享元工厂类(缓冲池如HashMap,获取享元对象的方法,其他处理缓冲池对象的方法)

二、代码示例

1、代码示例
获取象棋的棋子信息。一副中国象棋通常有很多棋子,每一个棋子的作用固定不发生变化,棋子存在一定的重复情况,如有多个炮,多个卒等。使用享元模式可以简化重复元素的创建。

// 1、定义享元接口
public interface ChineseChess {String getType();  // 类型String getDesc();  // 描述
}
// 2.1、定义享元实现类-马
public class Horse implements ChineseChess{@Overridepublic String getType() {return "马";}@Overridepublic String getDesc() {return "走日子形状,途径可吃掉其他棋子";}
}
// 2.2、定义享元实现类-炮
public class Cannon implements ChineseChess{@Overridepublic String getType() {return "炮";}@Overridepublic String getDesc() {return "走直线,间隔一个棋子打击其他棋子";}
}
// 3、创建享元工厂
import java.util.HashMap;
import java.util.Map;
public class ChineseChessFactory {private Map<String, ChineseChess> chessMap = new HashMap<>();public ChineseChess getChess(String type) {ChineseChess chess = null;if (chessMap.keySet().contains(type)) {chess = chessMap.get(type);} else {if ("马".equals(type)) {chess = new Horse();} else if ("炮".equals(type)) {chess = new Cannon();}chessMap.put(type, chess);}return chess;}public void removeChess(String type) {chessMap.remove(type);}
}
// 4、测试
public static void main(String[] args) {ChineseChessFactory chessFactory = new ChineseChessFactory();ChineseChess chess = chessFactory.getChess("马");ChineseChess chess2 = chessFactory.getChess("马");chessFactory.removeChess("马");ChineseChess chess3 = chessFactory.getChess("马");System.out.println(chess);System.out.println(chess2);System.out.println(chess3);ChineseChess chess1 = chessFactory.getChess("炮");System.out.println(chess1);}

运行结果:
在这里插入图片描述

总结:
当一个类内部不易变化,且这种类需要大量的创建和销毁时,可以使用享元模式去优化内存和提升性能。主要套路就3步,创建接口,创建实例,创建工厂。工厂内部通过缓存的方式(HashMap,redis等)保存了已经创建过的对象,再次获取时直接走缓存返回。有点类似单例模式和工厂模式的结合,但是享元又不一定是单例的,所以具体使用还要看场景需要。

学海无涯苦作舟!!!

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

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

相关文章

OxyPlot关注的窗口(即视图范围)始终设置到数据的最后一段

在OxyPlot中&#xff0c;如果你想要将关注的窗口&#xff08;即视图范围&#xff09;始终设置到数据的最后一段&#xff0c;你可以通过动态地更新图表的轴范围来实现。这通常涉及到监听数据的更改事件&#xff08;如果数据是实时更新的&#xff09;&#xff0c;并在数据更改时调…

django中的日志处理

1、事件追踪 在什么样的时间发生了什么样的事情 2、bug调试 3、程序告警 4、大数据统计 ELK 日志分析系统 elasticsearh logstasn kibana 名词概念 loggers&#xff1a;日志器 —— 定大方向&#xff1a;1 handlers&#xff1a;处理器 —— 执行:3 formatters&#xff…

MongoDB 从部署到掌握

一、docker部署MongoDB ## 通过docker安装MongoDB~~~shell #拉取镜像 docker pull mongo:4.0.3#创建容器 docker create --name mongodb-server -p 27017:27017 -v mongodb-data:/data/db mongo:4.0.3 --auth#启动容器 docker start mongodb-server#进入容器 docker exec -it …

【C++】详细版 RAII技术的应用之智能指针(智能指针发展历程和简单模拟实现介绍)

目录 前言 一、智能指针有什么用&#xff1f; 二、什么是RAII(智能指针的底层思想)&#xff1f; 三、智能指针的发展历程以及模拟实现 1.auto_ptr&#xff08;C98&#xff09; 2.unique_ptr&#xff08;C11&#xff09; 3.shared_ptr&#xff08;C11&#xff09; 前言 C中…

【vulhub靶场】Apache 中间件漏洞复现

【vulhub靶场】Apache 中间件漏洞复现 一、Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09;1. 漏洞详情2. 影响版本3. 漏洞复现 二、Apache多后缀解析漏洞&#xff08;apache_parsing_vulnerability&#xff09;1. 漏洞详情2. 漏洞复现 三、Apache HTTP Serv…

深度揭秘MySQL事务机制

在开发Java应用程序时&#xff0c;数据库事务的处理是确保数据完整性和一致性的关键所在。MySQL作为广泛使用的数据库系统&#xff0c;其事务机制对于开发者来说至关重要。本文将深入解析MySQL的事务机制&#xff0c;并通过Java代码示例展示如何在应用程序中正确地使用和管理事…

Spring AOP怎么聊(通俗易懂)

将一些通用的逻辑集中实现&#xff0c;然后通过AOP进行逻辑的切入&#xff0c;减少了零散的碎片化代码&#xff0c;提高了系统的可维护性。 具体是含义可以理解为︰通过代理的方式&#xff0c;面向切面编程&#xff0c;在调用想要的对象方法时候&#xff0c;进行拦截处理&…

SSL/TLS 协议

目录 概述 TLS 握手协议&#xff1a;建立安全连接的基础 TLS 握手流程&#xff1a;建立安全通道的关键步骤 TLS 记录协议&#xff1a;确保数据完整性和机密性 验证分析与 TLS 协议&#xff1a;确保服务器身份和数据完整性 TLS 与 SSL 的差异&#xff1a;演变和改进 结论 …

企业数字化转型走向平台化运营会经历哪些阶段?

蚓链实践总结企业数字化转型走向平台化运营通常会经历以下几个阶段&#xff1a; 1. 规划与准备阶段&#xff1a;明确转型目标和战略&#xff0c;评估现有业务和技术状况&#xff0c;制定转型计划。 2. 基础建设阶段&#xff1a;搭建数字化基础设施&#xff0c;包括云平台、数…

【Python爬虫实战入门】:教你一个程序实现PPT模版自由

文章目录 &#x1f4a5;一、PPT模版爬取&#x1f525;1.1 第一个爬虫&#x1f6b2;1. 获取下载页面链接 ❤️1.2 第二个爬虫&#x1f6b2;1.3 第三个爬虫&#x1f388;2. 文件保存 ❤️1.4 翻页处理 &#x1f525;二、完整代码 &#x1f525;&#x1f525;&#x1f525; Pytho…

【Linux】简易进度条的实现

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…

深度学习论文: LightGlue: Local Feature Matching at Light Speed

深度学习论文: LightGlue: Local Feature Matching at Light Speed LightGlue: Local Feature Matching at Light Speed PDF: https://arxiv.org/pdf/2306.13643 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/…

AI算法-高数2-导数定义和公式

P14 2.1 导数的定义(一):2.1 导数的定义_哔哩哔哩_bilibili 导数定义&#xff1a; 导数公式&#xff1a; P15 2.1 导数的定义(二)&#xff1a;2.1 导数的定义&#xff08;二&#xff09;_哔哩哔哩_bilibili [a,b]可导&#xff0c;a的端点&#xff1a;右可导&#xff0c;b端点&…

vim工作模式

vim 一、vim常用的工作模式 前言 这玩意命令太多&#xff0c;记得几个常用即可命令模式 命令模式&#xff1a;使用vi&#xff08;vim&#xff09;打开某个文件的时候默认进入的模式就是命令模式。 这种模式下最基础的功能就是上下左右键&#xff0c;还可以使用按键组合的方…

python学习之argparse模块

1.介绍 argparse是python用于解析命令行参数和选项的标准模块&#xff0c;用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数。 我们很多时候&#xff0c;需要用到解析命令行参数的程序。 我们常常可以把argparse的使用简化成下面四个步骤 2.使用步骤…

利用信息差:优惠券分享和变现思路

标题&#xff1a;“利用信息差&#xff1a;优惠券分享和变现思路” 在如今的电商时代&#xff0c;优惠券已成为吸引消费者的重要利器。然而&#xff0c;许多人并不知道&#xff0c;优惠券不仅可以用来省钱购物&#xff0c;还可以成为一种赚取收益的利器。本文将探讨如何利用信…

Leetcode—138. 随机链表的复制【中等】(cend函数)

2024每日刷题&#xff08;129&#xff09; Leetcode—138. 随机链表的复制 实现代码 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRan…

西藏在线教育系统哪家好,培训机构为什么讲师流动大?该如何留住讲师?

教育机构的核心竞争力其实还是产品竞争力&#xff0c;老师讲什么&#xff0c;这是教研团队在做的;老师如何讲&#xff0c;这是师资团队来做的;如何交付给学生&#xff0c;这是产品团队来做的&#xff0c;如果你有在线的团队的话&#xff0c;三个部分共同构成了整个产品&#xf…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水 503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元…