享元模式(结构型)

目录

一、前言

二、享元模式

三、总结


一、前言

        享元模式(Flyweight Pattern)是一种结构型设计模式,用于减少大量细粒度对象的内存占用。它通过共享尽可能多的相同数据来节约内存空间。

        享元模式由以下角色组成:

Flyweight(享元):

一个接口或抽象类,定义了对象的外部状态和内部状态的方法

ConcreteFlyweight(具体享元):

实现享元接口的具体类,包含享元对象的内部状态

UnsharedConcreteFlyweight(非享元):

不需要共享的对象

FlyweightFactory(享元工厂):

创建和管理享元对象,确保共享的享元对象被正确地使用

        整个享元模式的结构图:

二、享元模式

        我们可以以围棋为例,围棋坐标是19*19=361,围棋只有两种颜色,黑色和白色,有很多棋子,此时我们可以利用享元模式,所有黑棋共享一个对象,所有白棋共享一个对象,棋子格子的位置不同,因此位置可以设置为不共享的对象。

        首先创建围棋享元接口类GoPiece.class:

/*** @Author dengyifan* @create 2024/7/24 14:26* @description 享元接口*/
public interface GoPiece {String getColor();void place(int x, int y);
}

        再创建黑棋对象BlackPiece.class:

/*** @Author dengyifan* @create 2024/7/24 14:26* @description 具体享元类,黑棋*/
public class BlackPiece implements GoPiece{private final String color = "Black";@Overridepublic String getColor() {return color;}@Overridepublic void place(int x, int y) {System.out.println("棋子:" + color + ",位置信息:(" + x + ", " + y + ")");}
}

        白棋对象WhitePiece.class:

/*** @Author dengyifan* @create 2024/7/24 14:26* @description 具体享元类,白棋*/
public class WhitePiece implements GoPiece{private final String color = "White";@Overridepublic String getColor() {return color;}@Overridepublic void place(int x, int y) {System.out.println("棋子:" + color + ",位置信息:(" + x + ", " + y + ")");}
}

        编写享元工厂GoPieceFactory.class:

import java.util.HashMap;
import java.util.Map;/*** @Author dengyifan* @create 2024/7/24 14:26* @description 享元工厂*/
public class GoPieceFactory {private static final Map<String, GoPiece> pieceMap = new HashMap<>();public static GoPiece getPiece(String color) {GoPiece piece = pieceMap.get(color);if (piece == null) {if (color.equalsIgnoreCase("Black")) {piece = new BlackPiece();} else if (color.equalsIgnoreCase("White")) {piece = new WhitePiece();}pieceMap.put(color, piece);}return piece;}
}

        棋盘类BoardPosition.class:

/*** @Author dengyifan* @create 2024/7/24 14:29* @description 棋盘位置类,包含享元对象和位置,共享GoPiece对象,以及不共享的x、y位置信息*/
public class BoardPosition {private final int size;private final GoPiece[][] board;public BoardPosition(int size) {this.size = size;this.board = new GoPiece[size][size];}public void placePiece(String color, int x, int y) {GoPiece piece = GoPieceFactory.getPiece(color);board[x][y] = piece;piece.place(x, y);}public void printBoard() {for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {if (board[i][j] != null) {System.out.print(board[i][j].getColor().charAt(0) + " ");} else {System.out.print(". ");}}System.out.println();}}public GoPiece getPieceAt(int x, int y) {return board[x][y];}
}

         客户端调用类:

/*** @Author dengyifan* @create 2024/7/24 14:27* @description*/
public class Client {public static void main(String[] args) {BoardPosition board = new BoardPosition(19);board.placePiece("Black", 1, 2);board.placePiece("White", 2, 3);board.placePiece("Black", 3, 4);board.placePiece("White", 4, 5);board.printBoard();GoPiece piece1 = board.getPieceAt(1, 2);GoPiece piece2 = board.getPieceAt(2, 3);GoPiece piece3 = board.getPieceAt(3, 4);GoPiece piece4 = board.getPieceAt(4, 5);System.out.println("棋子1和棋子3: " + (piece1 == piece3));System.out.println("棋子2和棋子4: " + (piece2 == piece4));}
}

        运行结果:

三、总结

        优点与缺点

优点:

减少对象数量:

通过共享技术可以有效减少内存中的对象数量,从而提高系统的性能

节约内存:

共享的享元对象能够极大地节约内存空间

缺点:

复杂性增加:

系统中引入了享元工厂和共享机制,增加了系统的复杂性

非共享对象:

并不是所有的对象都适合使用享元模式,对于那些包含大量不变数据的对象,享元模式才有明显的优势

        应用场景:

文本编辑器:

在文本编辑器中,每个字符可以看作是一个对象。如果文档非常大,这些字符对象将占用大量内存。使用享元模式,可以将相同字符的对象共享起来,显著减少内存消耗

图形系统:

在图形系统中,经常需要绘制大量相同或相似的图形元素,如点、线、圆等。通过享元模式,可以将相同的图形对象共享,以节约内存

数据库连接池:

在数据库应用中,创建和销毁数据库连接的开销很大。使用享元模式,可以创建一个数据库连接池,所有的数据库连接都从池中获取和释放,从而提高性能和资源利用率

游戏开发:

在游戏开发中,大量的游戏对象(如树木、建筑物、NPC等)需要频繁使用。使用享元模式,可以将相同类型的游戏对象共享,从而减少内存占用,提高游戏性能

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

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

相关文章

「JavaEE」Spring MVC:基本操作1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 简介 Spring Web MVC 是⼀个 Web 框架&#xff0c;简称为 Spring MVC MVC 是 Model View Controller 的缩写&#xff0c;它是软件工程…

vscode回退不显示了,不方便操作

一、后退前进按钮 顶部显示&#xff0c;方便调试 <—— ——> 文件-> 首选项 -> 设置->commandcenter->勾选 Window: Title Bar Style->custom 将native —>custom

力扣每日一题1186. 删除一次得到子数组最大和【动态规划】

本题的核心在于对于每个元素&#xff0c;我们分别考虑保留和删除两种状态&#xff0c;并根据前面的状态转移来更新当前状态。最后&#xff0c;遍历所有元素&#xff0c;找到最大和即可。 状态定义 dp[i][0] 表示以第 i 个元素结尾且未删除元素的子数组的最大和。dp[i][1] 表示…

Qemu virtio-blk 后端驱动开发 - PureFlash对接

本文以PureFlash为例&#xff0c;介绍了如何将一个新的存储类型对接到qemu虚拟化平台下&#xff0c;为虚机提供存储能力。 关于virtio-blk以及其工作原理这里就不介绍了&#xff0c;网上有很多分析的文章。总之就是如果我们想给虚机提供一种新的存储类型&#xff08;不同于标准…

【日常记录】【JS】对一个数组,按照某个字段的值,进行分组

文章目录 1. 前言2. lodash 的分组3. Object.groupBy()参考链接 1. 前言 在开发中&#xff0c;经常会遇到一组数据&#xff0c;要按照某个字段进行分组&#xff0c;这个时候会有很多种方法&#xff0c;可以使用 forEach、reduce、等其他方法 reduce 方法 function groupBy(arr…

LLama 405B 技术报告解读

LLama 405B 技术报告解读 果然传的消息都是真的&#xff0c;meta在24号凌晨发布了llama 3的405B版本&#xff0c;这次还是做一个技术报告解读。 值得一提的是&#xff0c;在技术报告的开头&#xff0c;meta特意强调了一个 Managing complexity&#xff0c;大意是管控复杂度。…

主题公园- 海豹主题式风格餐厅设计【AIGC应用】

业务背景&#xff1a;海洋馆针对细分客群增设一个打卡主题点位&#xff0c;以海豹主题式餐厅为打卡卖点&#xff0c;效果参见海豹主题式风格。 AIGC概念图制作平台&#xff1a;&#xff08;可灵&#xff09; https://klingai.kuaishou.com/ 关键词&#xff1a; 海豹主题餐厅…

Blender插入关键帧的位置报错

在操作过程中&#xff0c;有时候是误操作或者是做动画选择了活动插帧集&#xff0c;导致按i键插入关键帧一直报提示&#xff1a;插入关键帧的帧位置或者是其他的报错弹窗。 1、解决方法是&#xff1a;在时间线的抠像(插帧)选项里&#xff0c;将活动插帧集给清空 2、若是骨骼动画…

Ubuntu 修改源地址

注意事项&#xff1a;版本说明&#xff01;&#xff01;&#xff01; Ubuntu24.04的源地址配置文件发生改变。 不再使用以前的 sources.list 文件&#xff0c;该文件内容变成了一行注释&#xff1a; # Ubuntu sources have moved to /etc/apt/sources.list.d/ubuntu.sources…

操作系统面试知识点总结2

#来自ウルトラマンメビウス&#xff08;梦比优斯&#xff09; 1 进程与线程 1.1 进程的概念和特征 更好地描述和控制程序并发执行&#xff0c;实现操作系统的并发性和共享性。 进程控制块&#xff08;PCB&#xff09;&#xff1a;更好的描述进程的基本情况和运行状态&#xff…

Eclipse 搭建 C/C++ 开发环境以及eclipse的使用

一、下载、安装 MinGW 1、下载: 下载地址&#xff1a;MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 点击“Download Latest Version”即可 下载完成后&#xff0c;得到一个名为 mingw-get-setup.exe 的安装文件。双击运行&#xff0c;安装即可。 …

大数据、区块链与人工智能

大数据、区块链与人工智能&#xff1a;技术融合与未来展望 摘要 本文旨在探讨大数据、区块链和人工智能这三个技术领域的基本概念、发展历程、应用场景及其相互之间的融合。文章首先分别介绍这三个技术的定义和特点&#xff0c;然后分析它们在不同行业中的实际应用&#xff0…

Llama 3.1发布,性能媲美最强闭源大模型

美国太平洋时间 7 月 23 日&#xff0c;Meta 公司发布了其最新的 AI 模型 Llama 3.1&#xff0c;这是一个里程碑时刻。Llama 3.1 的发布让我们看到了开源 LLM 有与闭源 LLM 一较高下的能力。 Meta 表示&#xff0c;“到目前为止&#xff0c;开源 LLM 在功能和性能方面大多落后于…

C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用

文章目录 0. 引言1. Iceoryx使用到的零拷贝技术1.1 零拷贝技术概述1.2 零拷贝的优势1.3 Iceoryx零拷贝的实现1.4 信息轮询与信号触发 2. Iceoryx的核心概念3. Iceoryx使用示例3.1 发布者程序3.2 订阅者程序3.3 编译和运行3.4 压力测试脚本 4. 参考文章 0. 引言 Iceoryx是一个开…

星环科技携手东华软件推出一表通报送联合解决方案

随着国家金融监督管理总局“一表通”试点工作的持续推进&#xff0c;星环科技携手东华软件推出了基于星环科技分布式分析型数据库ArgoDB和大数据基础平台TDH的一表通报送联合解决方案&#xff0c;并已在多地实施落地中得到充分验证。 星环科技与东华软件作为战略合作伙伴&…

深度学习复盘与论文复现E

文章目录 一、项目复现的问题及其解决方案1、 Cannot find DGL C graphbolt library2、 “is“ with a literal. Did you mean ““?”3、运行SEG、SPG查看GATNet的网络结构4、关于LI-FPN项目找不到数据粒度不匹配问题5、关于LI-FPN项目num_samples为空6、解决路径问题7、 !ss…

Java | Leetcode Java题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…

PHP基础语法(四)

一、字符串类型 1、字符串定义语法 1&#xff09;单引号字符串&#xff1a;在单引号内部&#xff0c;所有的字符都会按照字面意义解释&#xff0c;不会进行变量替换或转义处理&#xff0c;除了 \ 表示单引号本身。 $str1 Hello, World!;2&#xff09;双引号字符串&#xff…

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…

qt SQLite学习记录

1. 查看qt中数据库的驱动的类型的支持 QStringList drivers QSqlDatabase::drivers();//获取qt中所支持的数据库驱动类型foreach(QString driver,drivers){qDebug()<<driver;}2. Qt SQL 模块包含的主要类的功能介绍 Qt SQL 模块包含了一些主要的类&#xff0c;用于在 …