【Python笔记-设计模式】享元模式

一、说明

享元模式是一种结构型设计模式,它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。

(一) 解决问题

旨在减少大量相似对象创建时的内存开销

(二) 使用场景

  • 大量相似对象的创建且没有足够的内存容量时
  • 对象的大部分状态可以外部化:一个对象的大部分状态可以外部化,即可以从外部传入对象的状态,而对象自身只需保存少量的内部状态时

二、结构

  1. 享元模式只是一种优化。在应用该模式之前,你要确定程序中存在与大量类似对象同时占用内存相关的内存消耗问题,并且确保该问题无法使用其他更好的方式来解决。
  2. 享元(Flyweight)类包含原始对象中部分能在多个对象中共享的状态。同一享元对象可在许多不同情景中使用。享元中存储的状态被称为“内在状态”。传递给享元方法的状态被称为“外在状态”。
  3. 情景(Context)类包含原始对象中各不相同的外在状态。情景与享元对象组合在一起就能表示原始对象的全部状态。
  4. 通常情况下,原始对象的行为会保留在享元类中。因此调用享元方法必须提供部分外在状态作为参数。但你也可将行为移动到情景类中,然后将连入的享元作为单纯的数据对象。
  5. 客户端(Client)负责计算或存储享元的外在状态。在客户端看来,享元是一种可在运行时进行配置的模板对象,具体的配置方式为向其方法中传入一些情景数据参数。
  6. 享元工厂(FlyweightFactory)会对已有享元的缓存池进行管理。有了工厂后,客户端就无需直接创建享元,它们只需调用工厂并向其传递目标享元的一些内在状态即可。工厂会根据参数在之前已创建的享元中进行查找,如果找到满足条件的享元就将其返回;如果没有找到就根据参数新建享元。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
享元模式例:游戏程序中,相同类型的子弹可以共享同一个对象,从而节省内存资源。
"""class Bullet:"""子弹类"""def __init__(self, bullet_type):self.bullet_type = bullet_typedef fire(self, speed, position):print(f"以 {speed} 的速度,向 {position} 发射 {self.bullet_type}")class BulletFactory:"""子弹工厂类"""_bullets = {}@staticmethoddef get_bullet(bullet_type):if bullet_type not in BulletFactory._bullets:bullet = Bullet(bullet_type)BulletFactory._bullets[bullet_type] = bulletelse:bullet = BulletFactory._bullets[bullet_type]return bulletif __name__ == "__main__":"""以 1000 的速度,向 (100, 200) 发射 子弹以 1500 的速度,向 (150, 250) 发射 子弹以 2000 的速度,向 (200, 300) 发射 炮弹TrueFalse"""bullet1 = BulletFactory.get_bullet("子弹")bullet2 = BulletFactory.get_bullet("子弹")bullet3 = BulletFactory.get_bullet("炮弹")bullet1.fire(1000, (100, 200))bullet2.fire(1500, (150, 250))bullet3.fire(2000, (200, 300))print(bullet1 is bullet2)print(bullet1 is bullet3)

四、优缺点

优点

  • 减少内存消耗
  • 提高性能:减少了对象的创建和销毁次数

缺点

  • 可能引入额外的复杂性:在某些情况下,为了实现对象的共享和状态的管理,可能需要引入额外的复杂性,增加了系统的理解和维护难度。
  • 对外部状态的管理可能会带来线程安全问题:如果共享对象的外部状态需要被多个线程修改,可能会引入线程安全问题,需要进行额外的处理来保证线程安全。

 跳转主页:【Python笔记】设计模式-CSDN博客

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

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

相关文章

可视化 RAG 数据 - 用于检索增强生成的 EDA

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 原文地址:https://medi…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行,给网吧部署一套无缝漫游的WIFI网络势在必行。同时,网吧无线准入的验证码在客户机上面进行更新,以防周边的人员进行蹭网,损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

5G端到端案例三:锚点基站侧5G连接与VOLTE专载建立流程冲突导致CSFB回落问题

1. 问题描述: NSA组网场景下,语音业务仍使用4G VoLTE方案,在拉网测试中,发现存在较多流程交叉导致的VOLTE接入失败的问题。 流程冲突时的空口信令表现为,终端添加SCG流程与语音专载流程冲突时,专有承载建…

125 Linux C++ 系统编程4 Linux 静态库制作,动态库制作,静态库和动态库对比。静态库运行时找不到库的bug fix

一 静态库 和动态库 对比 静态库的原理:假设我们有一个 静态库,大小为500M,这个静态库实现了一些打牌的逻辑算法,提供了一堆API,让开发者 可以轻松的实现 54张扑克牌的随机发牌,指定发牌等功能。 我们写了…

红日靶场3

靶场链接:漏洞详情 在虚拟机的网络编辑器中添加两个仅主机网卡 信息搜集 端口扫描 外网机处于网端192.168.1.0/24中,扫描外网IP端口,开放了80 22 3306端口 80端口http服务,可以尝试登录网页 3306端口mysql服务,可…

跟着野火学FreeRTOS:第二段(事件组)

在小节里面介绍了二进制信号量,计数信号量,互斥量和递归互斥量等功能,其中二进制信号量和计数信号量(也包括队列)常用于任务和任务之间以及任务和中断之间的同步,她们具有以下属性: 当等待的事…

备考2025年考研数学(三):2015-2024年考研数学真题练一练

今天,我们继续分享2015年-2024年的考研数学三选择题,随机做5道真题,并提供解析。看看正在备考2025年考研的你能做对几道。 考研数学和政治、英语一项,都是拉分大户,但是数学如果掌握了技巧,吃透了知识点的话…

马丽离开沈腾,独自闪耀,实力证明一切。

♥ 为方便您进行讨论和分享,同时也为能带给您不一样的参与感。请您在阅读本文之前,点击一下“关注”,非常感谢您的支持! 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 马丽的事业突飞猛进,演艺之路从与沈腾的默默搭档到…

windows Server下Let‘s Encrypt的SSL证书续期

一、手动续期方法: 暂停IIS服务器 --> 暂时关闭防火墙 --> 执行certbot renew --> 打开防火墙 --> 用OpenSSL将证书转换为PFX格式-->pfx文件导入到IIS --> IIS对应网站中绑定新证书 --> 重新启动IIS -->完成 1、暂停IIS服务器 2、暂时关闭…

如何将QQ音乐的歌单导出到excel

一、提前准备 1.选择你需要导出的音乐歌单 2.得到你的歌单ID 1、首先打开QQ音乐,找到想要查看的歌单,点击歌单右上角的更多按钮。 2、其次在弹出的菜单中选择分享,在分享页面中,选择歌单分享。 3、最后在分享页面中&#xff0c…

【Docker 的安装:centos】

文章目录 1 :peach:各版本平台支持情况:peach:2 :peach:CentOS 安装:peach:2.1 :apple:安装依赖:apple:2.2 :apple:安装 Docker:apple:2.3 :apple:实战经验:apple:2.3.1 :lemon:Docker 镜像源修改:lemon:2.3.2 :lemon:Docker 目录修改:lemon: 1 🍑各版本平台支持情况…

【数据结构和算法初阶(C语言)】——数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)

1.何为数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。本质来讲就是在内存中去管理数据方式比如我们的增删查改。在内存中管理数据的方式有很多种(比如数组结构、链式结构、树型结…

【蓝桥杯省赛真题26】python整数逆序输出 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python整数逆序输出 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python整数逆序输出 第十二届蓝桥杯python比赛省赛真题 一、题目要求…

目标检测卷王YOLO卷出新高度:YOLOv9问世

论文摘要:如今的深度学习方法重点关注如何设计最合适的目标函数,使得模型的预测结果能够最接近真实情况。 同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。 现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。 本文将深…

2024全国水科技大会暨流域水环境治理与水生态修复论坛(六)

论坛召集人 冯慧娟 中国环境科学研究院流域中心研究员 刘 春 河北科技大学环境与工程学院院长、教授 一、会议背景 为深入贯彻“山水林田湖是一个生命共同体”的重要指示精神,大力实施生态优先绿色发展战略,积极践行人、水、自然和谐共生理念&…

【大数据】Flink 内存管理(二):JobManager 内存分配(含实际计算案例)

Flink 内存管理(二):JobManager 内存分配 1.分配 Total Process Size2.分配 Total Flink Size3.单独分配 Heap Size4.分配 Total Process Size 和 Heap Size5.分配 Total Flink Size 和 Heap Size JobManager 是 Flink 集群的控制元素。它由三…

【vscode】按F5无法执行调试python或go

原因: 找不到解析器,需要安装插件(python,或go 等) 安装插件后,还是无法执行,按 ctrlshiftp,看不到解析器 正常应该是: 解决方法: 1、判断python是否安装成功 pyth…

uni-app 黑魔法探秘 (一)—— 重写内置标签

一、背景 政采前端团队的移动端跨端解决方案选择的是 uni-app。跨端方案的好处就是一码多端,即书写一次就可以输出到 web、小程序、Anroid、iOS 等各端。既然是开发,那必然少不了配套的组件库和方法库,而我们公司因为历史原因存在一些的非 u…

每日一题(寻找奇数,寻找峰值)

寻找奇数_牛客题霸_牛客网 (nowcoder.com) #include <stdio.h> #include<stdlib.h> int main() {int n0;int num0;scanf("%d",&n);int* arr(int*)malloc(sizeof(int)*n);int i0;for(i0;i<n;i){scanf("%d",&arr[i]);//在循环内&…