津津乐道设计模式 - 享元模式详解(以影院座位举例让你快速掌握)

news2024/9/27 5:47:47

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 享元模式详解

  • 什么是享元模式
  • 享元模式适用场景
  • 生活案例
  • 案例代码
  • 享元模式优缺点
  • 结语

什么是享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在有效地共享对象以减少内存使用和提高性能。该模式通过将对象的部分状态进行共享,以避免创建过多的相似对象,从而节省内存空间。

在这里插入图片描述

享元模式适用场景

  • 当系统中存在大量相似对象时,可以使用享元模式来减少对象的数量,从而节省内存开销。
  • 当对象的大部分状态可以被外部状态替代时,可以将这些外部状态抽取出来共享,而将内部状态作为非共享状态。
  • 当需要对大量的细粒度对象进行操作时,使用享元模式可以减少对象的数量,提高系统性能。

常见的使用场景包括

  • 字符串池:在字符串处理中,常常使用字符串池来共享相同的字符串,以避免重复创建相同内容的字符串对象。
  • 连接池:数据库连接池和线程池是常见的享元模式应用。通过共享数据库连接或线程对象,可以避免频繁地创建和销毁对象,提高系统性能。
  • 缓存系统:在缓存系统中,可以使用享元模式来共享缓存对象,以避免重复创建相同的缓存项。
  • 图形绘制:在图形绘制中,可以使用享元模式来共享相同的图形对象,从而减少内存开销。

总之,享元模式通过共享对象的部分状态来节省内存空间和提高性能,适用于大量相似对象的场景,特别是当对象的内部状态较少且外部状态可被替代时。

生活案例

假设你是影院的管理者,需要管理和显示大量的座位信息。在这个场景中,可以使用享元模式来优化座位对象的创建和管理。
在这里插入图片描述

首先,我们可以创建一个座位类 Seat,该类包含座位的行号和列号等属性。然后,我们创建一个座位工厂类 SeatFactory,用于管理和共享座位对象。

在电影开始之前,当有观众购买座位并入场时,你可以根据座位的行号和列号从工厂中获取对应的座位对象。这样,即使有很多观众,但实际上只需要创建一次相同位置的座位对象,然后共享给多个观众使用,从而减少了对象的数量和内存占用。

当电影院当天关门结束营业后后,你可以清理座位工厂,释放座位对象。

通过使用享元模式,你可以在营业期间高效地管理和共享座位对象,避免了大量重复创建相同位置的座位对象,减少了内存开销,提高了系统性能。

这个生活场景中的座位管理就是享元模式的一个应用示例。通过共享相同的座位对象,我们可以有效地管理和优化座位信息,减少对象的数量,提高系统的效率。

案例代码

首先,创建座位类 Seat

public class Seat {
    private int row;
    private int column;

    public Seat(int row, int column) {
        this.row = row;
        this.column = column;
    }

    public int getRow() {
        return row;
    }

    public int getColumn() {
        return column;
    }
}

然后,创建座位工厂类 SeatFactory

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

public class SeatFactory {
    private static Map<String, Seat> seatMap = new HashMap<>();

    public static Seat getSeat(int row, int column) {
        String key = row + "-" + column;

        if (seatMap.containsKey(key)) {
            return seatMap.get(key);
        } else {
            Seat seat = new Seat(row, column);
            seatMap.put(key, seat);
            return seat;
        }
    }

    public static void clearSeats() {
        seatMap.clear();
    }
}

在使用场景中,生成和管理座位:

public static void main(String[] args) {
    // 生成座位并显示座位信息
    Seat seat1 = SeatFactory.getSeat(1, 1);
    Seat seat2 = SeatFactory.getSeat(1, 2);
    Seat seat3 = SeatFactory.getSeat(2, 1);
    Seat seat4 = SeatFactory.getSeat(2, 2);

    System.out.println(seat1.getRow() + "-" + seat1.getColumn());
    System.out.println(seat2.getRow() + "-" + seat2.getColumn());
    System.out.println(seat3.getRow() + "-" + seat3.getColumn());
    System.out.println(seat4.getRow() + "-" + seat4.getColumn());

    // 从工厂获取座位对象
    Seat seat5 = SeatFactory.getSeat(1, 1);
    Seat seat6 = SeatFactory.getSeat(1, 2);

    System.out.println(seat5.getRow() + "-" + seat5.getColumn());
    System.out.println(seat6.getRow() + "-" + seat6.getColumn());

    // 清理座位工厂
    SeatFactory.clearSeats();
}

在上述代码中,座位工厂类 SeatFactory 使用一个 HashMap 来管理座位对象,通过座位的行号和列号作为键,将座位对象作为值进行存储。当需要获取座位对象时,首先判断工厂中是否已经存在相同位置的座位对象,如果存在,则直接返回该对象;如果不存在,则创建一个新的座位对象,并将其添加到工厂中进行管理。

通过这种方式,我们可以在音乐会期间共享座位对象,避免了重复创建相同位置的座位对象,从而减少了对象的数量和内存占用。

注意:以上代码仅为示例,为了简化代码逻辑,未涉及多线程和线程安全性。在实际应用中,如果存在多个线程并发访问座位工厂,需要考虑线程安全性并进行适当的同步处理。

享元模式优缺点

享元模式的优点:

  • 减少内存占用:通过共享对象,减少了系统中的对象数量,从而降低了内存的占用。
  • 提高性能:由于减少了对象的创建和销毁,提高了系统的运行效率。
  • 简化对象管理:享元模式将共享对象的创建和管理集中在一个工厂类中,简化了对象的管理和维护过程。

享元模式的缺点:

  • 引入共享状态共享对象需要考虑线程安全性,特别是在多线程环境下访问共享对象时需要进行同步处理,这会增加系统的复杂性。
  • 不适用于所有情况:享元模式适用于有大量相似对象需要共享的场景,如果对象差异较大,共享的效果可能会降低,甚至无法使用享元模式。

结语

本章节主要介绍了享元模式、享元模式适用场景、享元模式的优缺点,并以影院座位的生活场景模拟享元模式的样例代码,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

样例代码:https://github.com/lhmyy521125/toher-designmode

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

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

相关文章

itext 7批量生成pdf文件并以压缩包形式下载

itext 7批量生成pdf文件并以压缩包形式下载 引入jar <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.0.3</version><type>pom</type></dependency>代码实现–生成…

逻辑漏洞小结之SRC篇(值得收藏,反复看!)

​​​​​最近在挖各大src&#xff0c;主要以逻辑漏洞为主&#xff0c;想着总结一下我所知道的一些逻辑漏洞分享一下以及举部分实际的案例展示一下&#xff0c;方便大家理解。 主要从两个方面看&#xff0c;业务方面与漏洞方面。&#xff08;接下来就从拿到网站的挖掘步骤进行…

如何使用模板化消息进行客户服务?(参考salesmartly)

如何使用模板化消息进行客户服务&#xff1f;&#xff08;参考salesmartly&#xff09; 一整天一遍又一遍地重复相同的答案可能会很乏味&#xff0c;尤其是对于您的客户服务团队而言。模板化消息&#xff0c;也称为预制回复或回复模板&#xff0c;已成为许多客户服务团队必备功…

Kong(Without DB)的安装和基本使用

下载和安装 Docs 这里以Centos为例 sudo yum install kong-enterprise-edition-3.3.0.0.rpm配置 ​ Kong的官网提供了两个配置模式一个是 Using a database 另一个是使用 yaml配置文件的形式&#xff0c;安装好后默认配置文件默认是/etc/kong/kong.conf.default 二者对比 …

React V6实现类似与vue的eventBus

功能背景 想要实现类似于vue的eventBus的功能&#xff0c;由一个组件通知其他一个或多个组件。应用场景&#xff1a;比如一个可视化大屏的界面&#xff0c;当筛选条件变化的时候&#xff0c;要同时通知到大屏中所有图表一起变化。&#xff08;当然使用store也是可以的&#xff…

逻辑回归算法实现

目录 1.关于逻辑回归的原理解析和准备工作 2.关于激活函数 3.关于数据集 4.编写LogisticsRegression类 5.逻辑回归测试 6.结果 1.关于逻辑回归的原理解析和准备工作 逻辑回归原理相关内容&#xff0c;请参考博主的另一篇文章&#xff1a;机器学习&#xff08;二&#xff…

菜鸟重磅推出多款科技新品,“工业大脑”PLC国产化获突破

“决策参谋”供应链计划、“工业大脑”PLC、“智能制造”科技解决方案……6月28日&#xff0c;在2023全球智慧物流峰会上&#xff0c;菜鸟自研的一批新产品、新方案正式曝光。菜鸟物流科技深耕制造业的成绩单也在峰会期间公布&#xff0c;华晨宝马等一批头部汽车企业已与其展开…

六种提高自己工作效率的方法!

为什么同样的时间&#xff0c;同样的都在休息都在玩&#xff0c;而别人工作却在玩的同时已经完成了一大半了。究竟是怎么做到的呢&#xff1f; 不仅仅是因为别人的工作效率高&#xff0c;而是因为他们会巧用工具。 那么你肯定想知道&#xff0c;这款工具是什么样的呢&#xf…

hutool工具类实现excel上传 支持03和07

一直感觉excel表的导入有很多代码&#xff0c;写一次忘一次&#xff0c;类太多&#xff0c;要知道怎么获取Workbook、Sheet、Cell、row等等&#xff0c;这么多类不可能一直记的住&#xff0c;都是写过之后保存&#xff0c;使用的时候拿出来改改&#xff0c;更烦人的是针对offic…

Vue Router replace 编程式导航 缓存路由组件

6.9.路由跳转的 replace 方法 作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式浏览器的历史记录有两种写入方式&#xff1a;push和replace push是追加历史记录replace是替换当前记录&#xff0c;路由跳转时候默认为push方式 开启replace模式 <router-link :replac…

松翰单片机keil环境芯片包

松翰单片机keil环境芯片包&#xff08;SN8F5700系列&#xff09;&#xff1a;安装时与Keil安装位置相同可以直接使用。 安装后依次点击可查看芯片包具体型号&#xff1a; 芯片包下载链接&#xff1a;阿里云盘分享https://www.aliyundrive.com/s/TnHchMhYeh1

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK进行定序器编程:根据每次触发信号移动感兴趣区域&#xff08;C&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和定序器编程的技术背景Baumer工业相机通过BGAPISDK进行定序器编程功能1.引用合适的类文件2.Baumer工业相机通过BGA…

laravel+vue共用一个域名,使用目录区分接口和项目的nginx配置

1、打包好的项目&#xff1a; 首先将打包好的项目放置public下&#xff0c;如下图 2、nginx配置文件 不带注释的伪静态&#xff08;推荐&#xff09; 备注&#xff1a;若在 location /admin 中的 admin 后面不加 “斜杠/”&#xff0c;则会出现访问 /admin-user 路由&#x…

Oracle Net Services 配置:LISTENER:没有为主机 VM-16-7-centos 返回有效的 IP 地址

问题描述&#xff1a; [rootVM-16-7-centos oracle]# /etc/init.d/oracledb_ORCLCDB-21c configure Configuring Oracle Database ORCLCDB. 准备执行数据库操作 已完成 8% 复制数据库文件 已完成 31% 已完成 100% [FATAL] 正在对命令行参数进行语法分析: 参数"silent&quo…

CLIP论文详细解析

论文链接&#xff1a;Learning Transferable Visual Models From Natural Language Supervision&#xff08;通过自然语言处理的监督信号&#xff0c;学习可迁移的视觉模型&#xff09;. 代码链接&#xff1a;CLIP. CLIP 摘要1.引言2.方法3.实验4.与人对比实验5.数据集去重6.L…

汽车远程启动程序APP的设计与实现(源码+文档+报告+任务书)

以 CAN (Controller Local Network&#xff0c;简称 CAN&#xff09;为基础的车辆遥控起动技术&#xff0c;通过将车辆的 PBD接口与车辆的 CAN总线相连&#xff0c;并与相应的控制系统相连&#xff0c;实现对车辆遥控启动。 此系统主要使用了Java、Android Studio、 MySQL数据…

Visual studio(VS)运行障碍指北

文章目录 VS: ....Microsoft.CppCommon.targets: error MSB6006: “CL.exe”已退出-VS2017许可证过期VS下Visual Assist X番茄插件安装失败子工程引用&#xff08;无法解析的外部符号&#xff09;无法打开.ui文件&#xff08;qt&#xff09;VS中qt子工程无法加载 VS: …Microso…

云原生应用交付平台 Orbit 主要功能与核心能力

GitOps GitOps 于 2017 年首创&#xff0c;是一种管理由 Kubernetes 提供支持的云原生系统的现代方式。它利用策略即代码方法来定义和管理现代应用程序堆栈的每一层——基础设施、网络、应用程序代码和 GitOps 管道本身。Orbit 基于 GitOps 方法理念提供以下能力&#xff1a; …

Revit中用楼板创建散水和批量成板

​一、Revit中用楼板创建散水 在Revit中用楼板来创建散水&#xff0c;散水&#xff1a;散水是指房屋外墙四周的勒脚处(室外地坪上)用片石砌筑或用混凝土浇筑的有一定坡度的散水坡。散水的作用是迅速排走勒脚附近的雨水&#xff0c;避免雨水冲刷或渗透到地基&#xff0c;防止基础…

三、云尚办公-角色管理前端

云尚办公系统&#xff1a;角色管理前端 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&am…