享元模式(十四)

news2024/12/22 23:32:55

每天都是全新的一天,感谢今日努力的自己。

上一章简单介绍了外观模式(十三), 如果没有看过, 请观看上一章

一. 享元模式

引用 菜鸟教程里面的外观模式介绍: https://www.runoob.com/design-pattern/flyweight-pattern.html

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。

这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

一.一 介绍

**意图: **运用共享技术有效地支持大量细粒度的对象。

主要解决: 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,

直接返回在内存中已有的对象,避免重新创建。

何时使用:
1、系统中有大量对象。
2、这些对象消耗大量内存。
3、这些对象的状态大部分可以外部化。
4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
5、系统不依赖于这些对象身份,这些对象是不可分辨的。

如何解决: 用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。

关键代码: 用 HashMap 存储这些对象。

应用实例: 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的连接池。

优点: 大大减少对象的创建,降低系统的内存,使效率提高。

缺点: 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

使用场景: 1、系统有大量相似对象。 2、需要缓冲池的场景。

注意事项: 1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。 2、这些类必须有一个工厂对象加以控制。

二. 享元模式实例

通过共享的方式高效的支持大量细粒度的对象

主要解决: 在有大量对象时,有可能会造成内存溢出,
我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建

会减少对象的创建, 降低系统的内存,使效率提高。

我们抽取出一个对象的外部状态 (不能共享的) 和内部状态 (可以共享的)。
然后根据外部状态的决定是否创建内部状态对象。 内部状态对象是通过哈希表保存的。
当外部状态相同的时候,不再重复的创建内部状态对象,从而减少要创建对象的数量。

组成角色具体关系作用
FlyWeightWebSite产品的抽象类产品的抽象类
ConcreteFlyWeightConcreteWebSite具体的享元角色,是具体的产品类,实现抽象角色定义相关业务具体的享元角色,是具体的产品类,实现抽象角色定义相关业务
UnSharedConcreteFlyWeightUser不可共享的角色,一般不会出现在享元工厂不可共享的角色,一般不会出现在享元工厂
FlyWeightFactoryWebSiteFactory享元工厂类,用于构建一个池容器(集合)享元工厂类,用于构建一个池容器(集合)

image-20230615112914856

二.一 不能共享的 User

@Data
@AllArgsConstructor
public class User {
    // 是改变的,不同的信息。
    private String name;
}

二.二 抽象的产品 WebSite

public abstract class WebSite {
    /**
     使用用户
     */
    public abstract void use(User user);
}

二.三 具体产品 ConcreteWebSite

@Slf4j
public class ConcreteWebSite extends WebSite{
    // 共享的,是内部的, 是不变的。
    private String type = "";

    public ConcreteWebSite (String type) {
        this.type = type;
    }

    @Override
    public void use(User user) {
        log.info(" 发布类型是: {}, 使用者是: {}", type,user);
    }
}

二.四 工厂 WebSiteFactory

public class WebSiteFactory {

    private Map<String, WebSite> webSiteMap = new HashMap<>();


    public WebSite getType (String type) {
        if (!webSiteMap.containsKey(type)) {
            webSiteMap.put(type,new ConcreteWebSite(type));
        }
        return webSiteMap.get(type);
    }

    public int count () {
        return webSiteMap.size();
    }
}

二.五 测试工厂

二.五.一 调用验证1

 @Test
    public void oneTest (){
        WebSiteFactory webSiteFactory = new WebSiteFactory();
        WebSite xinwen = webSiteFactory.getType("新闻");
        xinwen.use(new User("zhangsan"));

        // 定义的是不变的。
        WebSite weblog = webSiteFactory.getType("weblog");
        weblog.use(new User("zhangsan"));

        WebSite weblog2 = webSiteFactory.getType("weblog");
        weblog2.use(new User("lisi"));
    }

image-20230615113800899

二.五.二 调用验证2

@Test
    public void twoTest() {
        WebSiteFactory webSiteFactory = new WebSiteFactory();
        for (int i = 0 ;i <100 ;i++) {
            WebSite webLog = webSiteFactory.getType("webLog");
            webLog.use(new User(i+""));
            log.info("信息:{}",webLog.hashCode());
        }
    }

image-20230615113844709

hashcode 都是一样的,说明只构建了一次对象。


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Flyweight


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

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

相关文章

后,配置文件被清空,导致无法开启WiFi

root cause&#xff1a; /data/vendor/wifi/wpa/wpa_supplicant.conf 是0字节&#xff0c;导致wpa_supplicant_init_iface缺少”p2p_disabled1“的配置就会在走错flow到p2p wpa_supplicant_init_iface 》wpas_p2p_init 从而在HidlManager::registerInterface 进入 if (isP2pIf…

DeepSpeed零冗余优化器Zero Redundancy Optimizer

零冗余优化器 内容 零概述培训环境启用零优化 训练 1.5B 参数 GPT-2 模型训练 10B 参数 GPT-2 模型使用 ZeRO-Infinity 训练万亿级模型 使用 ZeRO-Infinity 卸载到 CPU 和 NVMe分配 Massive Megatron-LM 模型以内存为中心的平铺注册外部参数提取权重 如果您还没有这样做&…

【LeetCode】HOT 100(12)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

佩戴比较舒适的蓝牙耳机有哪些?值得入手的蓝牙耳机分享

​对于年轻人来说&#xff0c;耳机使用场景丰富&#xff0c;时尚追求度高&#xff0c;喜好的音乐类型也是多种多样&#xff0c;需求侧重也不尽相同。下面我来推荐几款相当不错的蓝牙耳机给大家&#xff0c;总会有喜欢那款&#xff01; 一、南卡OE蓝牙耳机 佩戴舒适度打分&…

【QQ界面展示-设置消息正文的背景图 Objective-C语言】

一、咱们上午说到哪儿了,还记得吗, 1.咱们上午是不是说到这儿了,可以显示正文、可以显示文字、并且,设置好背景图片了, 现在的问题就是,正文里面的文字,是不是超出这个图片了, 正文里面的文字,超出背景图片了, 那么,接下来,就给大家看一下,怎么解决这个问题, …

Macbook Pro双系统装Window10后设置触摸屏滑动方向

最近想给自己的Macbook Pro装Windows10操作系统&#xff0c;毕竟Windows才是真正的生产力工具&#xff0c;装了以后不需要两台笔记本了&#xff0c;直接在一台笔记本上有MacOS和Windows 装好以后发现触摸屏不能轻点触控还有触摸屏的滑动方向是反的 第一个问题&#xff0c;不能轻…

Ansys Zemax | 如何在序列模式下模拟分光棱镜

概述 这篇文章介绍了&#xff1a; 如何在序列模式下使用多重结构创建分光棱镜 如何在布局图以及分析/计算窗口中同时追迹透射和反射光线 在考虑偏振及镀膜的影响下如何计算透射和反射光线的总能量 &#xff08;联系我们获取文章附件&#xff09; 介绍 在 OpticStudio 中…

xxlJob任务管理平台500:xxl-job remoting error(connect timed out)

目录 一、问题截图 二、问题处理 2.1.查看执行器地址 2.2.查看本地端口 2.3.总结 三、关于地址的题外话 一、问题截图 此时可以看到code500&#xff0c;msg是连接超时&#xff0c;说明地址不通&#xff0c;那就是查看地址配置。 二、问题处理 2.1.查看执行器地址 …

使用CloudOS帮助企业落地云原生PaaS平台

PaaS究竟是什么&#xff1f; IaaS、SaaS的定义很清楚&#xff0c;而PaaS的定义就比较宽泛。所以&#xff0c;很多人把PaaS当做一个万能的“框”&#xff0c;什么都往里装&#xff0c;特别像一排垃圾桶中的那个“其他垃圾”桶&#xff0c;当你拎了一袋垃圾&#xff0c;不知道往…

C++技能 ( 3 ) - 详解泛型模版和特化模版的使用【函数模版、类模版、模版全特化、模版局部特化、可变参数模版、模版模版参数】

系列文章目录 C技能系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01;有更多博文系列等着看哦&#xff0c;会经常更新&#xff01;&#xff01;&#xff01; 因为你的关注激励着我的创作&#xff01…

网安云新品速递 | 移动应用安全检测服务,为App合规与安全保驾护航

移动应用安全攻击层出不穷 近年来&#xff0c;移动应用安全攻击事件频发&#xff0c;衍生出的用户数据安全问题&#xff0c;也逐渐成为用户、社会&#xff0c;乃至整个国家高度重视的问题。立法层面上&#xff0c;数据安全保护不断加强&#xff1b;监管层面上&#xff0c;相关…

当亲戚知道我是程序员后,对我一顿梭哈……

当亲戚知道我是程序员后&#xff1a; 有的让我修电脑&#xff1b; 有的让我PS&#xff1b; 有的让我扯网线&#xff1b; 有的让我搞路由器&#xff1b; 这次的亲戚&#xff0c;让我干起了老本行&#xff1a;软件开发。 他是做人力资源公司的&#xff0c;要让我开发个招聘…

Spark SQL数据源 - 基本操作

文章目录 一、案例演示读取Parquet文件二、在Spark Shell中演示课堂练习1、将4.1节的student.txt文件转换成student.parquet课堂练习2、读取student.parquet文件得到学生数据帧&#xff0c;并显示数据帧内容三、在IntelliJ IDEA里演示 一、案例演示读取Parquet文件 执行命令&a…

#提升开源项目质量与效率:使用 GitHub Actions 自动化流程

提升开源项目质量与效率&#xff1a;使用 GitHub Actions 自动化流程 简介&#xff1a; 在开源项目中&#xff0c;质量和效率是至关重要的因素。本文将介绍如何利用 GitHub Actions&#xff0c;结合 ChatGPT Code Review、Autofix、Codecov 和 Publish PyPI 四个强大的 Actio…

unbound配置cache服务器

unbound 安装unbound配置unbound生成DOT证书配置日志监听哪个IP允许哪些客户端查询配置转发DNSSEC开启domain-insecure生成密钥 检查配置查看缓存启动Unbound服务&#xff1a; 结果验证方法1&#xff1a;方法2: 排错方法 安装unbound 以下是将DNS over TLS&#xff08;DoT&…

一文吃透Spring集成MyBatis

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 文章目录 &#x1f496;集成思路✨怎么使用MyBatis✨集成的步骤✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件和测试集成MyBatis✨使用外部属性配置文件 &#x1f496;图书推荐 Java28岁了&#xff…

CRC校验(2):CRC32查表法详解、代码实现和CRC反转

对于现在的CPU来说&#xff0c;基本上都在硬件上实现了CRC校验。但我们还是想用软件来实现一下CRC的代码&#xff0c;这样可以更深入地理解里面的原理。所以这一节就来详细地解释如何使用查表法从软件上来实现CRC-32的校验。另外&#xff0c;CRC还有一种反转的情况&#xff0c;…

SpringCloud Ribbon负载均衡(十一)

前面搭建了初步例子&#xff0c;但是还没实现真正负载均衡&#xff0c;我们这里要先搞三个服务提供者集群&#xff0c;然后才能演示负载均衡&#xff0c;以及负载均衡策略&#xff1b; 新建项目microservice-student-provider-1002&#xff0c;microservice-student-provider-…

行星减速机优势有哪些?行星减速机五大优势

减速机是动力传动解决方案&#xff0c;通过选择高质量和高效率的变速箱&#xff0c;绝对可以提高整个动力传动系统的效率和性能。行星减速机有哪些优势呢&#xff1f; 1.保证灵活可靠的动力传动系统 减速机提供了广泛的功率和比率&#xff0c;使其成为许多行业的大多数应用的完…

代码随想录2刷|链表1.链表理论基础2移除链表元素3.设计链表4.翻转链表5.两两交换链表中的节点6.删除链表的倒数第N个节点7.链表相交8.环形链表lI

2移除链表元素 链接&#xff1a;力扣 一刷&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x…