设计模式之~享元模式

news2024/11/19 7:44:51

定义:

  • 享元模式英文称为“Flyweight Pattern”,又译为羽量级模式或者蝇量级模式。

  • 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

  • 享元模式的主要目的: 是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。

        flyweight,运用共享技术有效的支持大量细粒度的对象。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时就将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。

结构图:

实例:(用户类,用于网站的客户账号,是网站类的外部状态)

内部状态与外部状态:

        在享元对象内部并且不会随着环境改变而改变的共享部分,可以称为享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。

        享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了结构参数外基本上都是相同的,有时就能够大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来就可以通过共享大幅度地减少单个实例的数目。

        也就是说,享元模式Flyweight执行时所需要的状态是有内部的也可能有外部的,内部状态存储于ConcreteFlyweigt对象之中,而外部对象则应该考虑由客户端对象存储或计算,当调用Flyweight对象的操作时,将该状态传递给它。

优点:

  • 大大减少对象的创建

  • 降低系统的内存

  • 使效率提高

缺点:

  • 提高了系统的复杂度,需要注意分离出外部状态和内部状态。

  • 需要关注线程安全性问题

适用场景:

        如果一个应用程序使用了大量的相似对象,而这些对象造成了很大的存储开销就应该考虑使用;

        还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

        需要池化的场景

应用:

        说到享元模式,第一个想到的应该就是池化思想了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。

  • String常量池

  • 数据库连接池

  • 线程池

  • 缓冲池

    (享元模式的主要目的: 是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用)

享元模式与单例模式的异同:

        单例模式和享元模式都是为了避免重复创建对象,但是其本质是不一样的:

  • 其实现方式不一样,单例是一个类只有一个唯一的实例,而享元可以有多个实例,只是通过一个共享容器来存储不同的对象。

  • 其使用场景不一样,单例是强调减少实例化提升性能,因此一般用于一些需要频繁创建和销毁实例化对象或创建和销毁实例化对象非常消耗资源的类中,如连接池、线程池。而享元则是强调共享相同对象或对象属性,节约内存使用空间。

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

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

相关文章

git 分支管理:009

1. 分支的(创建、切换、删除) 注意:进行分支操作之前, 需要将当前分支需要提交的文件全部提交, 否则会将未处理的内容一并带到新分支下,这样容易造成分支内容混乱。 查看分支:git branch 创建分支:git bran…

氟化物超标怎么处理

项目基本信息 工艺及产品信息 甲方 / 采用工艺 过滤系统螯合树脂除氟系统 工程公司 / 工艺原理 废水除氟,耐受氯离子、硫酸根等阴离子的干扰 开始时间 2020/11/12 工艺特点 再生周期长 结束时间 2020/11/30 型号 CH-87 项目周期及项目地 15天 江…

力扣高频SQL50题(基础版)——第一天

力扣高频SQL50题(基础版)——第一天 1 可回收且低脂的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # WHERE子句中使用多条件 SELECT product_id FROM Products WHERE low_fatsY AND recyclableY1.3 运行截图 2 寻找用户推荐人 2.1 题目内容…

多家快递如何同时跟踪物流信息并分析出问题件

在这个快节奏的时代,我们经常需要查询快递信息,但是传统的快递查询方式可能需要花费大量的时间和精力。那么,有没有一种更加高效的方法可以同时分析多家快递物流信息并分析出问题呢?答案是肯定的!快递批量查询高手应运…

Latex

Latex 文章目录 Latex安装VSCode 配置 latexReference 安装 sudo apt-get install texlive-full # 安装时间有点长,其中的xetex集成了中文字体的环境,使得中文文档的生成变得很容易,可以使用系统自带得字体,使用更好看得字体。 apt-cache se…

Django实现接口自动化平台(三)实现注册功能【持续更新中】

上一章: Django实现接口自动化平台(二)认证&授权&登录【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章: 一、背景 1.1 实现功能 1、一共提供三个接口: 使用Django 自带的User模型,实现注…

《计算机组成原理》唐朔飞 第7章 指令系统 - 学习笔记

写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…

ChatGPT是什么,一文读懂ChatGPT

ChatGPT是个啥? 近期很多朋友后台私信GPT如何访问,我在网上找到一个免梯子的GPT,使用起来还是挺顺畅的,有需要的可以尝试使用,传送门,界面也挺清新的 近期,OpenAI 发布了 ChatGPT,是…

【JavaSE】Java基础语法(三十八):并发工具类

文章目录 1. Hashtable2. ConcurrentHashMap基本使用3. ConcurrentHashMap1.7原理4. ConcurrentHashMap1.8原理5. CountDownLatch6. Semaphore 1. Hashtable Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下…

chatgpt赋能python:Python中的乘方计算:介绍和应用

Python中的乘方计算:介绍和应用 乘方是数学运算中的重要部分,表示一个数(称为底数)被另一个数(称为指数)乘以若干次。在Python编程中,乘方运算也是非常常见的。本文将为您介绍Python中的乘方计…

读数据压缩入门笔记03_VLC

1. 概率、熵与码字长度 1.1. 数据压缩的目的 1.1.1. 给定一个数据集中的符号,将最短的编码分配给最可能出现的符号 1.2 1.2.1. 当P(A)P(B),也就是两个符号等可能出现时,数据集对应的熵取最大值LOG2(符号的个数)&…

设计模式之~组合模式

组合模式: 将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 结构图: 实例: 透明方式: leaf中也有add和remove叫做透明方式,在component中声明所有用来管…

数组及详解冒泡排序

数组及详解冒泡排序 一维数组的创建和初始化一维数组的创建一维数组的初始化一维数组的应用一维数组在内存中的存储 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的应用二维数组在内存中的存储 数组越界问题数组作为函数参数数组名的含义及特殊两个例子 冒泡…

PACS影像解决方案

现代医学影像技术的迅猛发展,使得PACS系统已逐渐成为各级医院实现信息化建设的重要组成部分。医学影像技术的进步也提升了医学影像的清晰度,推动二维PACS向三维升级转变。这一切都使得医学影像数据量激增,加之医疗行业法规的数据保存要求&…

对DataFrame指定字段进行整数编码df[‘字段名称‘].factorize()[0]

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 对DataFrame指定字段进行整数编码 df[字段名称].factorize()[0] 选择题 关于以下代码说法错误的是: import pandas as pd myData pd.DataFrame({编码前: [A, B, C, A, B]}) …

Missing-Semester Lec1 Solution

操作系统: m a c O S M o n t e r e y v e r s i o n 12.6 macOS \ Monterey version \ 12.6 macOS Montereyversion 12.6 1、查看shell是否符合要求 echo $SHELL /bin/zsh2、在/tmp下新建一个名为missing的文件夹 mkdir missing3、用man查看程序touch的使用手册…

我要官宣了!

小伙伴们大家好,我是阿秀。 我做写文章已经两年多时间了,最开始是分享自己的读研时生活的的小事,后来慢慢记录自己的学习和秋招找工作。 在研三那年校招结束后,我开始系统的分享自己的学习过程,分享自己学习过程中所记…

国产数据库|GBase 8s V8.8 学习笔记之架构介绍

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT) 如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA) 大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看国产数据库|GBase 8s V8.8 学习笔记之架构介绍&…

《计算机组成原理》唐朔飞 第10章 控制单元的设计 - 学习笔记

写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…

Office project 2021安装

哈喽,大家好。今天一起学习的是project 2021的安装,Microsoft Office project项目管理工具软件,凝集了许多成熟的项目管理现代理论和方法,可以帮助项目管理者实现时间、资源、成本计划、控制。有兴趣的小伙伴也可以来一起试试手。…