【设计模式】我终于读懂了享元模式。。。

news2024/9/22 17:22:49

祝大家开工大吉🧧🧧🧧!!主页有红包哦 点这里

文章目录

  • 祝大家开工大吉🧧🧧🧧!!主页有红包哦 [点这里](https://blink.csdn.net/details/1469531)
    • 🧧展示网站项目需求
    • 🧧传统方案解决网站展现项目
    • 🧧传统方案解决网站展现项目-问题分析
      • 🧧解决思路
    • 🧧享元模式基本介绍
      • 🧧享元模式经典的应用场景就是池技术了,String 常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式
      • 🧧享元模式的原理类图
        • 🧧对类图的说明
          • 🧧内部状态和外部状态
    • 🧧享元模式解决网站展现项目
    • 🧧享元模式在 JDK-Interger 的应用源码分析
    • 🧧享元模式的注意事项和细节

🧧展示网站项目需求

小型的外包项目,给客户 A 做一个产品展示网站,客户 A 的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同:
1)有客户要求以新闻的形式发布
2)有客户人要求以博客的形式发布
3)有客户希望以微信公众号的形式发布

🧧传统方案解决网站展现项目

1)直接复制粘贴一份,然后根据客户不同要求,进行定制修改
2)给每个网站租用一个空间
3)方案设计示意图
在这里插入图片描述

🧧传统方案解决网站展现项目-问题分析

需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,造成服务器的资源浪费

🧧解决思路

整合到一个网站中,共享其相关的代码和数据,对于硬盘、内存、CPU、数据库空间等服务器资源都可以达成共享,减少服务器资源,对于代码来说,由于是一份实例,维护和扩展都更加容易

🧧享元模式基本介绍

1)享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象
2)常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个
3)享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率

🧧享元模式经典的应用场景就是池技术了,String 常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式

在这里插入图片描述

🧧享元模式的原理类图

在这里插入图片描述

🧧对类图的说明

对原理图的说明-即(模式的角色及职责)

1)FlyWeight 是抽象的享元角色, 他是产品的抽象类, 同时定义出对象的外部状态和内部状态(后面介绍) 的接口或实现
2)ConcreteFlyWeight 是具体的享元角色,是具体的产品类,实现抽象角色定义相关业务
3)UnSharedConcreteFlyWeight 是不可共享的角色,一般不会出现在享元工厂。
4)FlyWeightFactory 享元工厂类,用于构建一个池容器(集合), 同时提供从池中获取对象方法

🧧内部状态和外部状态

比如围棋、五子棋、跳棋,它们都有大量的棋子对象,围棋和五子棋只有黑白两色,跳棋颜色多一点,所以棋子颜色就是棋子的内部状态;而各个棋子之间的差别就是位置的不同,当我们落子后,落子颜色是定的,但位置是变化的,所以棋子坐标就是棋子的外部状态

1)享元模式提出了两个要求:细粒度和共享对象。这里就涉及到内部状态和外部状态了,即将对象的信息分为两个部分:内部状态和外部状态
2)内部状态指对象共享出来的信息,存储在享元对象内部且不会随环境的改变而改变
3)外部状态指对象得以依赖的一个标记,是随环境改变而改变的、不可共享的状态。
4)举个例子:围棋理论上有 361 个空位可以放棋子,每盘棋都有可能有两三百个棋子对象产生,因为内存空间有限,一台服务器很难支持更多的玩家玩围棋游戏,如果用享元模式来处理棋子,那么棋子对象就可以减少到只有两个实例(颜色),这样就很好的解决了对象的开销问题

🧧享元模式解决网站展现项目

在这里插入图片描述

WebSite类,定义了最外层的抽象方法

在这里插入图片描述

ConcreteWebSite类,具体网站

在这里插入图片描述

WebSiteFactory类,网站工厂类,根据需要返回一个网站

在这里插入图片描述

User类,定义了用户类

在这里插入图片描述

Client,客户端,启动类

在这里插入图片描述

运行一下看看结果

在这里插入图片描述
现在我们debug跟着源码去理解一下

进入getWebSiteCategory方法

在这里插入图片描述

此时的池里面并没有这个type

在这里插入图片描述

我们给他创建一个ConcreteWebSite

在这里插入图片描述

这个时候我们有一个新闻网站了

在这里插入图片描述

现在给他一个外部状态

在这里插入图片描述
在这里插入图片描述

到第二个类型的时候已经有该类型了

在这里插入图片描述

我们直接返回出去就行了

在这里插入图片描述

但是我们的使用者不同

在这里插入图片描述

我们现在一共有两个网站,四个使用者

在这里插入图片描述

但是我们的池的数量还是两个

在这里插入图片描述

🧧享元模式在 JDK-Interger 的应用源码分析

1)Integer 中的享元模式
2)代码分析+Debug 源码+说明

在这里插入图片描述
在这里插入图片描述
这里可以理解为 -128 - 127为内部状态

🧧享元模式的注意事项和细节

1)在享元模式这样理解,“享”就表示共享,“元”表示对象
2)系统中有大量对象,这些对象消耗大量内存,并且对象的状态大部分可以外部化时,我们就可以考虑选用享元模式
3)用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象,用 HashMap/HashTable 存储
4)享元模式大大减少了对象的创建,降低了程序内存的占用,提高效率
5)享元模式提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变,这是我们使用享元模式需要注意的地方.
6)使用享元模式时,注意划分内部状态和外部状态,并且需要有一个工厂类加以控制。
7)享元模式经典的应用场景是需要缓冲池的场景,比如 String 常量池、数据库连接池

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

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

相关文章

Python基础学习 -- 进程锁

一、join函数的作用1、等子进程执行完,主进程再结束2、将子进程都存储到一个列表,每个子进程都调用一下join方法if __name__"__main__":print("我是主线程")stime.time()a[2,3,4]b[] #存储创建好的进程for i in a:pProcess(targetfu…

入门算法,这篇文章你得看!(java、算法基础、常用算法)

想用Java快速入门算法?这篇文章你得看! 提示:本文章适合想要入门算法,并且想 “快速” 达到一定成果的同学们阅读~ 文章非常非常非常长(可能是你见过最长的博客)!!! 阅读…

Authing 身份云入选《数字身份治理与管理(IGA)应用实践指南》报告

身份是物理实体映射在网络空间的一串数字代码,是数字世界的通行证。掌控了统一的权威数字身份就等同掌控了实体在数字空间的行为。网络业务的快速发展,使业务与安全深度融合到一起,并使数字身份成为数字化经济建设的重要基石。同一实体可以更…

【数据结构初阶】第一篇——算法性能分析

算法效率 什么是大O 时间复杂度分析 概念 大O渐进表示法 不同数据规模的差异 复杂表达式的化简 O(logn)中的log是以什么为底? 案例分析 算法为什么会超时 递归算法的时间复杂度 空间复杂度分析 概念 案例分析 递归算法的性能分析 代码的内存消耗 算法效率 算法…

如何使用VMware虚拟机(带你快速了解)

前言 📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴 目录 前言 一、什么是虚拟机 二、VMware的简介 1、大概介绍 2、详…

数据结构 第四章 串

她:点击收听 1 基本知识点 1、串中的元素是字符 2、操作的对象往往不再是单个数据元素,而是一组数据元素(子串) 3、串:由零个或多个字符组成的有限序列 4、子串:串中任意连续个字符组成的子序列 5、包含子串的串又被称为该子串的主串 6、真…

LeetCode[685]冗余连接II

难度:困难题目:在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。输入一个有向图&#xf…

Linux 笔记3

5.Linux 的网络信息5.1主机名称5.1.1临时修改:hostname 新名字 (需要重新进入才能显示新名字)reboot重启虚拟机5.1.2永久:vi /etc/hostname5.2DNS解析dns解析域名域名-》ipdns域名劫持:将域名对应的ip改掉5.2.1修改主机…

networkx学习(四)无标度网络

networkx学习(四)无标度网络 无标度网络: 对于随机网络和规则网络,度分布区间非常狭窄,大多数节点都集中在节点度均值< k >的附近,说明节点具有同质性,因此< k >可以被看作是节点度的一个特征标度。而在节点度服从幂律分布的网络中,大多数节点的度都很小,…

从零创建vue示例

从零创建vue搭建node环境创建vue项目vue项目目录介绍搭建node环境 1.下载node(node官网) 安装node一路点next即可 2.windowR—cmd ----测试一下npm -v 以及node -v 显示版本号 3.执行以下命令&#xff08;-g表示全局安装&#xff09; npm install -g vue npm install -g vue…

优化命令 nload详解

优化命令 nload详解 引言 nload用于实时监控linux下网络流量信息&#xff0c;是命令行工具&#xff0c;用来监控网络的吞吐量。它使用两个图表数据来对进出站流量进行可视化。 一、nload安装 nload工具并不是centos自带的&#xff0c;需要我们手动安装下载 直接yum安装查不到…

Kettle 快捷引入数据库

在编写kettle任务时往往需要连接数据库&#xff0c;kettle一共提供了四种数据库配置方式&#xff0c;JDBC、ODBC、OCI、JNDI&#xff0c;我最初直接使用的最为熟悉的JDBC&#xff0c;但是多写几个转换程序就会发现&#xff0c;每新建一个转换任务文件时都需要重新配置数据信息&…

DDOS渗透与攻防(四)之应用层DoS攻击

系列文章 DDOS渗透与攻防(一)之拒绝服务攻击概念介绍 DDOS渗透与攻防(二)之SYN-Flood攻击 DDOS渗透与攻防(三)之socktress攻击 应用层DoS攻击 攻击协议原理介绍说明-应用层DoS 应用服务漏洞 服务代码存在漏洞&#xff0c;遇异常提交数据时程序崩溃应用处理大量并发请求能力…

Git(见Docx)

Git的概念【1】Git技术&#xff1a;公司必备&#xff0c;一定要会 【2】Git概念&#xff1a; Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的项目。【3】什么是版本控制&#xff1f; 版本控制是一种记录一个或若干文件内容变化&#…

Redis 发布订阅模式的深度解析与实现消息队列

1 发布订阅模式(Pub/Sub)的概述我们可以利用Redis的List数据结构实现一个简单的消息队列&#xff0c;通过lpush命令写入消息&#xff0c;通过rpop 命令拉取消息&#xff0c;也可以使用BRPOP实现阻塞式的拉取消息。上面的消息队列有一个缺点&#xff0c;那就是不支持消息多播机制…

百趣代谢组学文献分享:以猪为模型检测哺乳动物之间的代谢物交换

百趣代谢组学文献分享&#xff0c;您对哺乳动物不同器官之间的代谢物交换情况了解吗&#xff1f; 本期百趣代谢组学小趣给大家分享的是美国普林斯顿大学Joshua D. Rabinowitz团队发表在Cell Metabolism上的研究成果。该团队以猪为模型&#xff0c;利用高通量靶标技术定量测定了…

QEMU/KVM带与不带音频驱动参数的实际区别

实际工作中用到QEMU/KVM&#xff0c;按照书中的命令启动虚拟机后&#xff0c;发现Ubuntu镜像启动后找不到声卡设备&#xff0c;经过一番搜索和尝试&#xff0c;最终发现是“-device ac97”这一关键选项所导致的。现将具体的对比结果记录如下&#xff1a; 不带“-device ac97”…

2023编程语言趋势

2023编程语言趋势 作为CTO&#xff0c;我需要持续关注编程语言的发展。按照惯例&#xff0c;每年年初我都会对未来一年关键编程语言的趋势做一定的预判。今年由于众所周知的原因&#xff0c;预测地有些晚&#xff0c;我选择在开年的第一天给出我的预测&#xff0c;也算是祝大家…

(Java高级教程)第四章必备前端基础知识-第三节2:JavaScript数组、函数和对象

文章目录一&#xff1a;数组二&#xff1a;函数三&#xff1a;对象一&#xff1a;数组 数组&#xff1a;JavaScript中的数组和Java中的ArrayList有点相似&#xff0c;可以动态扩容&#xff0c;并且由于它是动态类型的语言&#xff0c;所以数组内的元素类型不要求一定是相同的 …

【Git】安装搭建与相关概念

目录 1. 安装 1.1出现安全警告&#xff0c;点击运行 1.2浏览协议&#xff0c;下一步 1.3安装目录&#xff0c;所需要磁盘空间大小&#xff0c;下一步 1.4Git Bash需要安装的&#xff0c;其他默认即可&#xff0c;下一步 1.5开始菜单&#xff0c;下一步 1.6默认编辑器&…