小谈设计模式(27)—享元模式

news2025/2/25 11:30:46

小谈设计模式(27)—享元模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 享元模式
    • 模式结构分析
      • 享元工厂(FlyweightFactory)
      • 享元接口(Flyweight)
      • 具体享元(ConcreteFlyweight)
      • 非共享具体享元(UnsharedConcreteFlyweight)
      • 客户端(Client)
    • 工作原理
      • 1
      • 2
      • 3
    • 适用场景
      • 1
      • 2
      • 3
    • 优缺点分析
      • 优点
        • 减少内存使用
        • 提高性能
        • 简化对象结构
      • 缺点:
        • 对象共享可能导致线程安全问题
        • 需要额外的管理机制
    • Java程序示例
      • 程序分析

专栏介绍

专栏地址

http://t.csdnimg.cn/VpriY

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在享元模式中,共享的对象被称为享元(Flyweight),而非共享的对象被称为外部状态(Extrinsic State)。
在这里插入图片描述

模式结构分析

享元工厂(FlyweightFactory)

负责创建和管理享元对象。它维护一个享元池(Flyweight Pool),用于存储已经创建的享元对象。

享元接口(Flyweight)

声明共享对象的方法,可以接收外部状态作为参数。

具体享元(ConcreteFlyweight)

实现享元接口,实现共享对象的方法。具体享元对象可以被共享和重用。

非共享具体享元(UnsharedConcreteFlyweight)

不可共享的具体享元对象,通常不会被其他对象使用。

客户端(Client)

使用享元模式的对象。它通过享元工厂获取享元对象,并将外部状态传递给享元对象。
在这里插入图片描述

工作原理

1

在客户端需要使用享元对象时,首先通过享元工厂获取对象。如果对象已经存在于享元池中,则直接返回该对象;否则,创建一个新的享元对象并加入到享元池中。

2

客户端将外部状态作为参数传递给享元对象,享元对象根据外部状态进行处理,完成相应的操作。

3

客户端可以同时使用多个享元对象,每个对象都可以接收不同的外部状态。

适用场景

1

系统中存在大量相似对象,且这些对象可以共享部分内部状态。

2

对象的创建和销毁频繁,且创建和销毁对象的代价较大。

3

对象的内部状态可以被外部状态替代,且外部状态可以在对象被创建之后进行修改。
在这里插入图片描述

优缺点分析

优点

减少内存使用

通过共享对象,减少系统中的对象数量,从而减少内存的使用。

提高性能

通过共享对象,减少对象的创建和销毁次数,提高系统的性能。

简化对象结构

将对象的内部状态和外部状态分离,简化对象的结构。

缺点:

对象共享可能导致线程安全问题

如果多个线程同时访问共享对象,并修改其外部状态,可能会导致线程安全问题。

需要额外的管理机制

为了确保对象的共享和重用,需要额外的管理机制来维护享元池,增加了系统的复杂性。
在这里插入图片描述

Java程序示例

// 享元接口
public interface Flyweight {
    void operation(String externalState);
}

// 具体享元
public class ConcreteFlyweight implements Flyweight {
    private String internalState;

    public ConcreteFlyweight(String internalState) {
        this.internalState = internalState;
    }

    @Override
    public void operation(String externalState) {
        System.out.println("Internal state: " + internalState);
        System.out.println("External state: " + externalState);
    }
}

// 享元工厂
public class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight flyweight1 = factory.getFlyweight("key1");
        flyweight1.operation("state1");

        Flyweight flyweight2 = factory.getFlyweight("key2");
        flyweight2.operation("state2");

        Flyweight flyweight3 = factory.getFlyweight("key1");
        flyweight3.operation("state3");
    }
}

程序分析

在上述示例中,享元模式通过共享具有相同内部状态的对象来减少内存使用。FlyweightFactory负责创建和管理享元对象,ConcreteFlyweight实现了享元接口,并可以被共享和重用。客户端通过享元工厂获取享元对象,并将外部状态作为参数传递给享元对象。

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

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

相关文章

2023年中国汽车智能工厂市场规模不断增大,智能化已成趋势[图]

汽车智能工厂是在数字化工厂的基础上&#xff0c;通过互联网技术与工业技术结合&#xff0c;数据监管设备以及AI等技术的结合&#xff0c;实现汽车整车从原材料及零部件的生产到运输、组装一系列的自动化生产。汽车智能工厂很大程度上降低成本和人为干扰&#xff0c;实现自动化…

使用VisualVM查看.hprof文件

1、启动VisualVM&#xff1a; VisualVM通常包含在Java开发工具包&#xff08;JDK&#xff09;中。您可以在JDK的bin目录中找到jvisualvm.exe&#xff08;Windows&#xff09;或jvisualvm&#xff08;Linux/Unix&#xff09;文件&#xff0c;然后运行它。 2、加载文件 3、查看…

c++-list

文章目录 前言一、list介绍及使用1、list介绍2、list使用2.1 list构造函数的使用2.2 list iterator的使用2.3 list capacity的使用2.4 list modifiers的使用2.5 list使用算法库中的find模板生成find方法2.6 list中的sort方法 二、list模拟实现1、查看list源码的大致实现思路2、…

SpringBoot注解篇之@Validated

目录 前言Validated作用NotNull与NotBlank区别总结 前言 大家好&#xff0c;我是AK&#xff0c;在做新项目顺便整理SpringBoot相关内容&#xff0c;这里主要介绍下Validated注解的应用&#xff0c;减少核心业务逻辑中一些参数判断的代码。 Validated作用 Validated 是 Spring…

【算法-动态规划】零钱兑换问题-力扣 322

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

PACS外围硬件--九五小庞

1.串口脚踏本线序&#xff1a;白 4 红6 黑8 2.USB脚踏板&#xff08;常用&#xff09; USB脚踏设置软件下载地址https://pmo0158ab-pic2.ysjianzhan.cn/upload/FootSwitchSet20200820.rar 在按键处输入快捷键&#xff0c;写入就可以 3.视频采集卡&#xff08;常用&#xff09;…

angular项目指定端口,实现局域网内ip访问

直接修改package.json文件 "dev": "ng serve --host 0.0.0.0 --port 8080"终端运行npm run dev启动项目。 这里就指定了使用8080端口运行项目&#xff0c;同时局域网内的其他电脑可以通过访问运行项目主机的ip来访问项目 例如项目运行在ip地址为192.168.2…

SpringBoot篇之集成Mybatis-plus

目录 前言一、Mybatis-plus介绍1.1 官网 二、代码生成器总结 前言 大家好&#xff0c;我是AK&#xff0c;整理的SpringBoot集成Mybatis-plus以及代码生成器的使用&#xff0c;时间原因简单的整理下&#xff0c;有问题的可以评论区见或私信我。 一、Mybatis-plus介绍 1.1 官网…

Tomcat的安装和配置

一.Tomcat下载&#xff1a;去Tomcat官网地址 在左侧Download中选择你需要下载的版本&#xff0c;这里我选择Tomcat9 根据电脑系统是32位还是64位选择&#xff0c;这里我选择64-bit Windows zip&#xff0c;点击即可下载 下载后直接解压&#xff0c;这里我解压在E盘的computer…

互联网医院牌照|互联网医院牌照办理指南及材料

互联网医院牌照办理成为医疗行业的热门话题&#xff0c;而作为一家以创新为核心的企业&#xff0c;我们致力于为您揭开这个引人入胜的新领域。随着科技的迅速发展&#xff0c;互联网医院正成为医疗行业的一大趋势。互联网医院牌照&#xff0c;作为一种新型的医疗机构认证&#…

ChatGPT AIGC 制作大屏可视化分析案例

第一部分提示词prompt: 商品 价格 p1 13 p2 41 p3 42 p4 53 p5 19 p6 28 p7 92 p8 62 城市 销量 北京 69 上海 13 南京 18 武汉 66 成都 70 你现在是一名非常专业的数据分析师,请结合上述数据完成下列几件事情 1:第一部分数…

实验室超声波清洗器有哪些特点?

随着科技的飞速发展&#xff0c;各种技术领域相互渗透&#xff0c;超声技术已广泛应用于工程、机械、电子、化工、生物、医疗等诸多行业&#xff0c;并且在日常生活中也扮演着不可或缺的角色。实验室超声波清洗器作为一种高效的清洁设备&#xff0c;具有以下特点&#xff1a; 首…

Qt应用开发(基础篇)——树结构视图 QTreeView

一、前言 QTreeView类继承于QAbstractItemView类&#xff0c;提供了一个树结构视图的模型。 视图基类 QAbstractItemView QTreeView默认为Model/View实现&#xff0c;下面是一个使用QFileSystemModel和QTreeView的结合&#xff0c;显示系统文件结构的实例。 QFileSystemModel …

深度学习基础知识 给模型的不同层 设置不同学习率

深度学习基础知识 给模型的不同层 设置不同学习率 1、使用预训练模型时&#xff0c;可能需要将2、学习率设置方式&#xff1a; 1、使用预训练模型时&#xff0c;可能需要将 &#xff08;1&#xff09;预训练好的 backbone 的 参数学习率设置为较小值&#xff0c; &#xff08;2…

BI工具:让数据分析井然有序一望而知

BI&#xff08;Business Intelligence&#xff09;工具是一类专门用于数据分析和决策支持的软件工具。 它们能够将企业内部和外部的数据进行整合、处理和可视化&#xff0c;帮助用户从海量数据中获取有价值的见解和洞察&#xff0c;并以直观、易懂的方式展示给决策者和相关人员…

解决uniapp里scroll-view横向滚动的问题

一、前言 本以为是一件很简单的事&#xff0c;结果浪费了整整一个上午&#xff0c;并且问题并没有全部解决....后来没办法&#xff0c;用了touchmove模拟的滑动&#xff0c;如果有好的解决方法麻烦告诉我...非常感谢~ 一、问题 其实我想要实现的功能很简单&#xff0c;就是一…

Dubbo—Admin 整体架构与安装步骤

​回顾 Dubbo 服务治理体系的总体架构&#xff0c;Admin 是服务治理控制面中的一个核心组件&#xff0c;负责微服务集群的服务治理、可视化展示等。 Admin 部署架构 总体上来说&#xff0c;Admin 部署架构分为以下几个部分&#xff1a; Admin 主进程&#xff0c;包括服务发现…

表单规定输入域的选项列表(html5新元素)

datalist datalist 元素规定输入域的选项列表。 datalist属性规定 form 或 input 域应该拥有自动完成功能。当用户在自动完成域中开始输入时&#xff0c;浏览器应该在该域中显示填写的选项&#xff1a; 使用 input元素的列表属性与datalist元素绑定. 还有一定的搜索能力&…

c++视觉检测-----角点检测

角点检测&#xff1a;cornerHarris() cornerHarris()函数是OpenCV中用于执行Harris角点检测的函数。Harris角点检测是一种用于检测图像中角点的技术&#xff0c;通常用于特征检测和图像匹配。以下是cornerHarris()函数的用法&#xff1a; void cornerHarris(InputArray src, …

数据库基础篇一

MySQL数据模型 关系型数据库通过表来存储数据的数据库 SQL分类 数据库操作 进入数据库 mysql -u root -p #输入密码即可在cmd命令行窗口使用mysql 1.查询 2.创建 create database test; create database if not exists test; #如果test数据库不存在&#xff0c;则创建tes…