23种设计模式之享元模式(Flyweight Pattern)

news2024/9/21 20:24:21

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的享元模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始

文章目录

  • 享元模式概念
  • 享元模式使用场景
  • 享元模式优缺点
  • 享元模式代码案例

享元模式概念

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少对象的数量,以节省内存空间和提高性能。它通过共享相同或相似状态的多个对象来减少对象的数量。享元模式通常用于大量创建细粒度对象的场景。

享元模式使用场景

在享元模式中,我们创建一个工厂类(Flyweight Factory),该工厂类对外提供获取享元对象的方法。享元对象包含两部分属性:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态指不随外界环境改变而改变的共享部分,外部状态指随着环境的改变而改变的部分。

当客户端需要一个享元对象时,它向工厂类请求一个对象,工厂类会首先查询对象池中是否已经有该对象的实例。如果有,就直接返回对象池中的实例;如果没有,则创建一个新的实例并将其放入对象池中,同时返回给客户端。

享元模式优缺点

享元模式的优点在于,它可以大大减少系统中对象的数量,从而提高系统的性能和内存利用率。它也可以使得代码更加简洁,易于维护和扩展。

但是,享元模式也有一些缺点,在某些情况下,它可能会牺牲部分内存以换取性能的提升。同时,由于享元对象通常是不可变的对象,因此可能会对系统中的某些业务逻辑造成影响。

享元模式代码案例

下面以一个具体例子,比如制作黑白棋游戏来进一步说明:

对于黑白棋这个游戏来说,我们需要大量的棋子对象,如果为每一个棋子都单独创建一个对象,那么系统的性能和内存开销都会非常大。而使用享元模式,我们可以将一些相同的棋子对象共享起来,只需要保存其内部和外部状态区分即可。例如,黑方和白方用不同颜色的棋子,但同一颜色的棋子之间是可以互相替换的。

定义棋子类Piece

public interface Piece {
    void put(int x, int y);
}

public class BlackPiece implements Piece {
    @Override
    public void put(int x, int y) {
        System.out.println("在坐标 (" + x + ", " + y + ") 放置了一个黑棋子");
    }
}

public class WhitePiece implements Piece {
    @Override
    public void put(int x, int y) {
        System.out.println("在坐标 (" + x + ", " + y + ") 放置了一个白棋子");
    }
}

以上代码实现了两个具体的棋子类:BlackPiece 和 WhitePiece。它们都实现了 Piece 接口,并重写了其中的 put() 方法,用于在指定坐标放棋子。

实现享元工厂类PieceFactory

import java.util.HashMap;
import java.util.Map;

public class PieceFactory {
    private final Map<String, Piece> map = new HashMap<>();

    public Piece getPiece(String color) {
        Piece piece = map.get(color);

        if (piece == null) {
            switch (color) {
                case "black":
                    piece = new BlackPiece();
                    break;
                case "white":
                    piece = new WhitePiece();
                    break;
                default:
                    throw new IllegalArgumentException("Unsupported color: " + color);
            }
            map.put(color, piece);
        }

        return piece;
    }
}

以上代码实现了一个操作棋子对象的共享工厂PieceFactory,其中使用了HashMap来保存已经创建过的棋子对象。直接调用getPiece()方法即可根据颜色获取相应的棋子对象。如果该颜色的棋子对象不存在,则创建一个新的棋子对象并存入map中,否则直接从map中获取棋子对象。

在客户端中使用享元模式

public class Client {
    public static void main(String[] args) {
        PieceFactory factory = new PieceFactory();
        Piece black1 = factory.getPiece("black");
        black1.put(1, 1);
        Piece black2 = factory.getPiece("black");
        black2.put(2, 2);
        Piece white1 = factory.getPiece("white");
        white1.put(3, 3);
        Piece white2 = factory.getPiece("white");
        white2.put(4, 4);
    }
}

在上面的代码中,我们可以看到一个完整的享元模式实现。在客户端中,我们只需要获取工厂类中提供的共享对象即可,通过调用 put() 方法来为棋子设置坐标。

通过以上例子,我们可以看出享元模式的优点:它大幅度减少内存占用并提高了系统性能,对于类似的大量重复对象的场景非常友好

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

【SAM系列】SAM Enhanced Pseudo Labels for Weakly Supervised Semantic Segmentation

论文链接&#xff1a;https://arxiv.org/abs/2305.05803 论文代码&#xff1a;https://github.com/cskyl/sam_wsss 目的 探索如何结合SAM在image-level supervision下改善WSSS的性能 结论 可以在 seed maks&#xff0c;pseudo label&#xff0c;prediction三处结合SAM来改善…

opencv图像分割

图像分割是指把一个图像分成不同的部分&#xff0c;用来处理图像的技术。在计算机视觉中&#xff0c;图像分割是指将图像从背景中分离出来的技术&#xff0c;或称目标检测或目标识别。分割后的结果是将不同区域划分为不同的像素。 在很多情况下&#xff0c;需要对一幅图像进行分…

深度相机如何标定?(代码开源)

文章&#xff1a;Robust Intrinsic and Extrinsic Calibration of RGB-D Cameras 作者&#xff1a;Filippo Basso, Emanuele Menegatti, and Alberto Pretto. 编译&#xff1a;点云PCL 代码&#xff1a; https://github.com/iaslab-unipd/rgbd_calibration 欢迎各位加入知识星球…

Servlet API 获取请求数据

目录 一. 构造HTTP请求的方式1.1 使用 Postman 来构造请求1.2 使用ajax 来构造请求 二 . HttpServletRequest API使用api实现前后端交互1 . 通过 GET 请求 query string 进行传参2 . POST请求 form 表单传参 &#xff08;body&#xff09;3 . Post 请求的 json 格式的数据传参&…

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析&#xff0c;但是都是针对机器人的手&#xff08;夹爪&#xff09;眼睛&#xff08;相机&#xff09;进行标定。例如&#xff1a; 标定学习笔记&#xff08;四&#xff09;-- 手眼标定详解 手眼标定_全面细致的推导过程 本文主要描述多激光…

【c语言】文件的光标操作

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

Java --- 云尚办公角色管理模块实现

目录 一、项目介绍 1.1、项目简介 1.2、技术框架 1.3、项目构建 1.4、配置依赖 二、mybatis-plus测试使用 三、角色管理 3.1、完善统一返回信息 3.2、整合knife4j 3.3、分页查询功能 3.4、添加、修改、删除功能 3.5、完善时间格式 3.6、异常统一处理 四、前端知识 4.1…

LeetCode662.设计循环队列||4种方法实现

目录 题目 思路1(链表) 代码 思路2(数组) 代码 题目 题目要求的队列需要实现的功能有 ①Creat---设置队列长度 ②Front---获取队列头 ③Rear---获取队列尾 ④en----插入元素 ⑤de---删除元素 ⑥empty---判空 ⑦full---判满 思路1(链表) &#x1f50d;普通队列长度没有限制&…

MySQL高级——第16章_多版本并发控制

第16章_多版本并发控制 1. 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC 是通过数据行的多个版本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操…

ARM学习笔记_1 介绍,Keil环境搭建

从零开始学ARM 学习自b站一口linux老师的课程。 文章目录 从零开始学ARM介绍为什么要学汇编&#xff1f;ARM是什么&#xff1f;SOC计算机历史冯诺依曼结构介绍哈佛架构介绍混合架构介绍CPU运行原理 环境搭建 介绍 学习ARM需要学计算机原理&#xff0c;汇编&#xff0c;C语言&…

强大,Midjourney Imagine API接口,AI画画的福音!

前几天跟大家分享过一篇 ”让chatGPT教你AI绘画|如何将chatGPT与Midjourney结合使用&#xff1f;“&#xff0c;但是由于许多小伙伴们使用Midjourney还有许多困难&#xff0c;又要上网&#xff0c;还要注册Discord&#xff0c;MJ的使用成本很高&#xff0c;让大家望而却步&…

【计算机视觉 | 目标检测】目标检测中的评价指标 mAP 理解及计算(含示例)

文章目录 一、目标检测的评价指标1.1 Precision1.2 Recall1.3 Average Precision&#xff08;AP&#xff09;1.4 mean Average Precision&#xff08;mAP&#xff09;1.5 Intersection over Union&#xff08;IoU&#xff09;1.6 F1-score 二、基础知识2.1 Precision2.2 Recall…

5.20下周黄金行情走势分析及开盘独家交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(5月19日)&#xff0c;现货黄金价格下跌又反弹&#xff0c;现货黄金持续走高美联储主席鲍威尔&#xff1a;那些积极的供应冲击不太可能重复出现&#xff0c;美联…

初阶数据结构之单链表的实现(四)

文章目录 链表的概念及结构一、链表的逻辑结构是什么样的&#xff1f;二、链表的初始化2.1链表初始化的示意2.2链表初始化代码实现 三、链表的各类接口函数定义四、链表的各类接口函数的代码实现4.1链表的打印代码实现4.1.1打印代码的实现 4.2链表的尾插代码实现4.2.1尾插代码实…

Mongodb 6.0 变化的配置参数与连接的方式变化

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

【故障排查】【伪处理】Jenkins在iframe窗口无法添加secret text凭证

问题描述 环境的ingress是&#xff0c;有个 svc 暴露 30080 -> 80 大致流程&#xff1a; svc&#xff08;ingress-nginx&#xff09; 30080端口 -> pod (nginx-ingress-controller ) 80端口 -> ingress -> svc -> pod &#xff08;Jenkins 8080端口&#xff0…

基于粒子群优化算法的路径问题优化研究及其在Python中的实现

基于粒子群优化算法的路径问题优化研究及其在Python中的实现 文章目录 基于粒子群优化算法的路径问题优化研究及其在Python中的实现一、简介二、引言1、粒子群优化算法简介2、PSO算法与鸟群的类比 三、PSO算法数学原理1、粒子的位置和速度2、适应度函数3、粒子的个体最优和全局…

基于html+css的图展示80

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

从零开始搭建属于自己的hexo博客

前提要素&#xff1a;一个提供博客运行的服务器或者XX云。 先展示一下搭建好的样子&#xff0c;给大家一点动力&#xff1a; 整个搭建过程大概需要30分钟不到&#xff0c;请各位控制自己的时间~ 好了&#xff0c;废话不多说我们开始&#xff01; 1、首先登录我们准备好的服…

redis高级篇二(分片集群)

一)进行测试Sentinel池: ​ Controller public class RestController {RequestMapping("/Java100")ResponseBodypublic String start(){//1.配置信息HashSet<String> setnew HashSet<>();// 连接信息 ip:port// set.add("127.0.0.1:27001");se…