当前位置: 首页 > article >正文

结构型——享元模式

享元模式

享元模式的核心思想是通过共享技术减少大量细粒度对象的创建,降低内存占用并提升性能。换句话说,它通过分离对象的内部状态(可共享的固有属性)和外部状态(随场景变化的属性)实现对象复用。

特点

  • 对象复用:通过共享池管理可复用的对象,避免重复创建
  • 内存优化:减少内存占用,提升性能
  • 状态分离:
    • 内部状态:对象固有的、可共享的属性
    • 外部状态:对象依赖外部环境的参数,随场景变化的属性

模式结构

角色描述
抽象享元 (Flyweight)定义享元对象的接口,声明一个用于外部状态的接口
具体享元 (ConcreteFlyweight)实现抽象享元接口,定义内部状态,通常为不可变的
享元工厂 (FlyweightFactory)创建和存储享元对象的工厂类,确保相同内部状态的对象唯一
客户端 (Client)维护外部状态,通过享元工厂获取享元对象并调用其方法

简单示例


# 抽象享元对象
class AirplaneInterface:                                 def flight_route(self, city_a, city_b): pass         # 外部状态由参数传递# 具体享元对象
class Airplane(AirplaneInterface):def __init__(self, manufacturer, model):self.manufacturer = manufacturer                 # 固有的属性self.model = model                               # 固有的属性def flight_route(self, city_a, city_b):              # 外部状态由参数传递print(f"{self.manufacturer} {self.model} is flying from {city_a} to {city_b}.")# 享元工厂
class AirplaneFactory:_airplanes = {}                                      # 享元池@classmethoddef get_airplane(cls, manufacturer, model):if f"{manufacturer} {model}" not in cls._airplanes:cls._airplanes[f"{manufacturer} {model}"] = Airplane(manufacturer, model)return cls._airplanes[f"{manufacturer} {model}"]# 客户端代码
if __name__ == "__main__":factory = AirplaneFactory()B787 = factory.get_airplane("Boeing", "787")B787.flight_route("New York", "Los Angeles")# Boeing 787 is flying from New York to Los Angeles.B747 = factory.get_airplane("Boeing", "747")B747.flight_route("Tokyo", "Shanghai")# Boeing 747 is flying from Tokyo to Shanghai.# 验证享元池中只有两个对象B787_2 = factory.get_airplane("Boeing", "787")print(f"B787 和 B787_2 是同一个对象: {B787 is B787_2}")# B787 和 B787_2 是同一个对象: TrueB747_2 = factory.get_airplane("Boeing", "747")print(f"B747 和 B747_2 是同一个对象: {B747 is B747_2}")# B747 和 B747_2 是同一个对象: Trueprint(f"享元池中享元对象的数量: {len(factory._airplanes)}")# 享元池中享元对象的数量: 2

应用场景

  • 存在大量相似对象时(图型渲染、样式配置)
  • 对象大部分状态可外部化,且外部状态变化频繁时(数据库连接对象)

优缺点

  • 优点:
    • 内存减少,性能提升
    • 支持大规模细粒度对象管理
  • 缺点
    • 内外状态分离,提高了代码复杂度
    • 共享对象要求线程安全

享元模式 VS 单例模式

维度享元模式单例模式
核心目的共享内部状态减少对象创建,减少内存占用保证全局唯一
对象数量允许存在多个实例(但相同内部状态的实例唯一)严格要求只有一个实例
状态管理区分内部状态(共享)和外部状态(客户端传递)所有状态都为内部状态,但全局共享
线程安全需要注意懒汉式需要,饿汉式不需要
设计复杂度需要先区分内外状态,设计共享池简单
应用场景存在大量相似对象时全局唯一对象

相关文章:

结构型——享元模式

享元模式 享元模式的核心思想是通过共享技术减少大量细粒度对象的创建,降低内存占用并提升性能。换句话说,它通过分离对象的内部状态(可共享的固有属性)和外部状态(随场景变化的属性)实现对象复用。 特点…...

淘宝API关键词接口详解(实战案例)

以下为您详解淘宝API关键词接口的调用方法及实战案例: 一、接口定义与核心功能 淘宝关键词API是开放平台提供的标准化数据服务接口,允许开发者通过关键词检索商品全维度信息。其核心功能包括: 精准检索:支持商品标题、属性、类…...

Pyecharts功能详解与实战示例

一、Pyecharts简介 Pyecharts是一个基于Python的开源数据可视化库,它基于百度的Echarts库,提供了丰富的图表类型和强大的交互功能。通过Pyecharts,你可以轻松创建各种精美的图表,如折线图、柱状图、饼图、散点图、地图等&#xf…...

传统金融和分布式金融

文章目录 传统金融和分布式金融一、传统金融机构的核心问题深度剖析1. 支付与清算系统的结构性缺陷2. 金融排斥(Financial Exclusion)的根源3. 中心化风险的爆发与传导 二、DeFi的技术突破与创新机制1. 支付与清算:区块链的底层重构2. 普惠金…...

EasyUI数据表格中嵌入下拉框

效果 代码 $(function () {// 标记当前正在编辑的行var editorIndex -1;var data [{code: 1,name: 1,price: 1,status: 0},{code: 2,name: 2,price: 2,status: 1}]$(#dg).datagrid({data: data,onDblClickCell:function (index, field, value) {var dg $(this);if(field ! …...

C语言:扫雷

在编程的世界里,扫雷游戏是一个经典的实践项目。它不仅能帮助我们巩固编程知识,还能锻炼逻辑思维和解决问题的能力。今天,就让我们一起用 C 语言来实现这个有趣的游戏,并且通过图文并茂的方式,让每一步都清晰易懂 1. 游…...

操作系统必知的面试题

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

清华大学.智灵动力-《DeepSeek行业应用实践报告》附PPT下载方法

导 读INTRODUCTION 今天分享是由清华大学.智灵动力:《DeepSeek行业应用实践报告》,主要介绍了DeepSeek模型的概述、优势、使用技巧、与其他模型的对比,以及在多个行业中的应用和未来发展趋势。为理解DeepSeek模型的应用和未来发展提供了深入的…...

数据库三级填空+应用题(1)

填空 35【答案】TOP 3 WITH TIES 【解析】希望选出商品数量最多的前3类商品,并获得相应的商品类别和数量。with ties一般是和Top 、 order by相结合使用,表示包括与最后一行order by后面的参数取值并列的结果。 36在SQL Server 2008中,每个数据页可存储8…...

可视化图解算法:链表的奇偶重排(排序链表)

1. 题目 描述 给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。 注意是节点的编号而非节点的数值。 数据范围:节点数量满足 0≤n≤105,节点中的值都满足 0≤val≤10000 要…...

Atlas 800I A2 双机直连部署DeepSeek-R1-w8a8

一、环境信息 1.1、硬件信息 Atlas 800I A2 * 2 1.2、环境信息 操作系统:openEuler 22.03 LTS NPU驱动:Ascend-hdk-910b-npu-driver 24.1.0 linux-aarch64.run NPU固件:Ascend-hdk-910b-npu-firware 7.5.0.3.220.run MindIE镜像&#xff…...

如何确保异步任务在 HTTP 返回后继续执行?context.WithoutCancel

文章目录 如何确保异步任务在 HTTP 返回后继续执行?问题分析如何确保异步任务在 HTTP 返回后继续执行?(1)使用独立的 context(2)手动传递父 ctx 中的值(3)使用 context.WithoutCance…...

SAP Activate Methodology in a Nutshell Phases of SAP Activate Methodology

SAP Activate Methodology in a Nutshell Phases of SAP Activate Methodology...

开源AI大模型、AI智能名片与S2B2C商城小程序源码:实体店引流的破局之道

摘要:本文聚焦实体店引流困境,提出基于"开源AI大模型AI智能名片S2B2C商城小程序源码"的技术整合方案。通过深度解析各技术核心机制与协同逻辑,结合明源云地产营销、杭州美甲店裂变等实际案例,论证其对流量精准获取、客户…...

JVM 02

今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...

C++ :顺序容器

一、顺序容器概述 顺序容器通过元素在容器中的线性存储顺序来维护数据&#xff0c;允许通过位置&#xff08;下标&#xff09;​访问元素。标准库提供6种核心顺序容器&#xff1a; 容器类型头文件底层结构特点vector<vector>动态数组快速随机访问&#xff0c;尾部高效增…...

身份证信息要素真伪认证-身份证二、三要素实名接口

在数字化时代&#xff0c;身份验证的准确性和安全性至关重要。身份证二、三要素实名接口作为一种高效且可靠的身份验证工具&#xff0c;正逐渐成为众多行业确保信息真实性、防范欺诈行为的关键手段。 身份证二、三要素实名接口主要验证身份证号码、姓名以及证件头像是否一致。通…...

pyecharts在jupyter notebook中不能够渲染图表问题。

在使用jupyter notebook中使用pyecharts绘制可视化图表的时候,发现图表不能渲染到页面中,生成的html是没问题的,本文主要解决在jupyter notebook中不能渲染这个问题。 1、原因分析 2、解决办法 如果是使用的虚拟环境,需要下你提前激活虚拟环境,再进行下列操作。 因为需要…...

【线程安全的单例模式和STL是否是线程安全/智能指针是否是线程安全】

文章目录 一、单例模式的特点二、饿汉模式实现单例三、懒汉模式实现单例四、STL线程安全吗&#xff1f;五、智能指针线程安全吗&#xff1f; 一、单例模式的特点 一个类&#xff0c;只应该实例化了一个对象&#xff0c;就是单例。 二、饿汉模式实现单例 举个饿汉模式的例子&…...

C++11 标准库 `find` 与 `find_if` 详解

一、std::find 函数 功能&#xff1a;在指定范围内查找特定值&#xff0c;返回第一个匹配元素的迭代器&#xff1b;若未找到&#xff0c;返回 end() 迭代器。 原型&#xff1a; template <class InputIt, class T> InputIt find(InputIt first, InputIt last, const T&…...

每日总结3.24

第十届蓝桥杯大赛软件赛省赛C/C 大学 B 组 183.完全二叉树的权值&#xff08;找规律&#xff0c;临界值&#xff09; #include <bits/stdc.h> using namespace std; int a[1000005]; int main() { int m;int d; cin>>m; int sum;int maxn0; for(int i1;i&…...

Redis分布式寻址算法

分布式寻址算法是分布式系统中用于确定数据应该存储在哪个节点的算法。这些算法对于实现高效的数据存取、负载均衡和系统扩展性至关重要。以下是几种常见的分布式寻址算法的解释&#xff1a; 1. Hash 算法 原理&#xff1a;通过哈希函数将数据的键&#xff08;Key&#xff09…...

kotlin init执行顺序

一 代码 kotlin: package test.fclass Test1 { }class TestInit(s: String, i: Int) {var name: String? nullvar age 0private var a :Int 1init {this.name sthis.age iprintln("init代码块: $name, $age")}}转成java // Test1.java package test.f;import…...

详解Spark executor

在 Apache Spark 中&#xff0c;Executor&#xff08;执行器&#xff09; 是运行在集群工作节点&#xff08;Worker Node&#xff09;上的进程&#xff0c;负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一&#xff0c;直接决定了任务的并行度和资源利用…...

单片机 - RAM 与内存、ROM 与硬盘 之间的详细对比总结

RAM 与 内存 RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09; 和 内存 这两个术语通常是 同义词&#xff0c;即 内存 常常指的就是 RAM。 1. RAM&#xff08;内存&#xff09; 定义&#xff1a;RAM 是计算机中的 主存储器&#xff0c;用于临时存…...

NVIDIA V100显卡支持Tensor Core技术,而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理

NVIDIA V100显卡支持Tensor Core技术&#xff0c;而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理。 要利用Tensor Core加速&#xff0c;需要满足以下一些条件&#xff1a; 软件支持&#xff1a;所使用的深度学习框架&#xff08;如PyTorch、TensorFlo…...

《深度剖析:BERT与GPT——自然语言处理架构的璀璨双星》

在自然语言处理&#xff08;NLP&#xff09;的广袤星空中&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;与GPT&#xff08;Generative Pretrained Transformer&#xff09;系列模型宛如两颗最为耀眼的星辰&#xff0c;引领…...

《AI大模型趣味实战 》第7集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 1

AI大模型趣味实战 第7集&#xff1a;多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 1 摘要 在信息爆炸的时代&#xff0c;如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过Python和Flask框架&#xff0c;结合大模型的强大…...

JS 算术运算符

JavaScript 算术运算符 一、基础运算符及行为特性 1. 四则运算 加法 + 数值相加:5 + 3 → 8字符串拼接(隐式类型转换):"5" + 3 → "53"混合类型优先级:1 + true → 2(true转1)减法 -、乘法 *、除法 / 纯数值运算:5 - "2" → 3(字符串转…...

基于Spring Boot的健身房管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...