【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_type

    def fire(self, speed, position):
        print(f"以 {speed} 的速度,向 {position} 发射 {self.bullet_type}")


class BulletFactory:
    """子弹工厂类"""
    _bullets = {}

    @staticmethod
    def get_bullet(bullet_type):
        if bullet_type not in BulletFactory._bullets:
            bullet = Bullet(bullet_type)
            BulletFactory._bullets[bullet_type] = bullet
        else:
            bullet = BulletFactory._bullets[bullet_type]
        return bullet


if __name__ == "__main__":
    """
        以 1000 的速度,向 (100, 200) 发射 子弹
        以 1500 的速度,向 (150, 250) 发射 子弹
        以 2000 的速度,向 (200, 300) 发射 炮弹
        True
        False
    """
    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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这是我见过最全的权限系统设计方案!

日常工作中权限的问题时时刻刻伴随着我们,程序员新入职一家公司需要找人开通各种权限,比如网络连接的权限、编码下载提交的权限、监控平台登录的权限、运营平台查数据的权限等等。 在很多时候我们会觉得这么多繁杂的申请给工作带来不便,并且…

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式,现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具(插件),需要授权后才能使用; 本软件…

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

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

Nuxt3实现多语言与事件总线(EventBus)

我的nuxt版本为 3.10.0 一、多语言实现 这里我使用得是 nuxtjs/i18n 这个库 安装 npm install -D nuxtjs/i18nnext根目录创建 i18n.config.ts 文件 export default {legacy: false,locale: zh, // 默认值messages: {zh: {home: 首页,useKill: 使用技巧,helpCenter: 帮助中…

H桥逆变控制方式(单极性倍频)

单极性倍频图像 内部做了载波取反:正相载波和负相载波 最后都和调制载波一起比较 正相载波:Q7导通为高电平,Q15导通为低电平 负相载波:Q16导通为高电平,Q8导通为低电平 导通次序为:Q7Q16——Q7Q8——Q7Q…

Mamba 作者谈 LLM 未来架构

文章目录 前言 1、为什么注意力机制有效? 2、注意力计算量呈平方级增长 3、Striped Hyena 是个什么模型? 4、什么是 Mamba? 5、Mamba 硬件优化 6、2024年架构预测 7、对 AI 更多的预测 本片文章来自【机器之心】对Mamba作者进行采访所进行的编译整理。 …

Sora 对未来视频创作伦理的挑战和思考

Sora 对未来视频创作伦理的挑战和思考 随着人工智能技术的飞速发展,AI视频模型Sora的出现为视频创作带来了革命性的变革。然而,在技术进步的同时,也带来了一些伦理问题值得我们深思。 1. 真实性和虚假信息: Sora能够生成逼真的视频画面&…

初识51单片机

##江科大51单片机学习 什么是单片机??? 单片机,英文名,Micro Controller Unit,简称MCU(tips:有人会简称它为CPU,但不是如此,CPU其实被集成在MCU中&#xff…

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样(upsampling)2、…

测试计划、测试方案、测试策略、测试用例的区别

一 测试计划 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、各阶段的测试任务、时间进度安排,谁执行任务和风险控制等,可以包括测试策略。 二 测试方案 测试方案是指描述需要测试的特性、测试的方…

jvm-jvm七款经典垃圾收集器

一,七款经典垃圾收集器 七款经典的垃圾收集器: 收集器串行、并行or并发新生代/老年代算法目标适用场景Serial串行新生代复制算法响应速度优先单CPU环境下的Client模式Serial Old串行老年代标记-整理响应速度优先单CPU环境下的Client模式、CMS的后备预案…

基于Java SSM框架实现艺诚美业管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现艺诚美业管理系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&a…

SpringBoot实现缓存预热的几种常用方案

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

visual studio2019怎么修改字体

点击菜单栏中的“工具” “选项” 环境 -> 字体和颜色 Consolas是vscode的默认字体,还挺好用的。

【自然语言处理-二-attention注意力 是什么】

自然语言处理二-attention 注意力机制 自然语言处理二-attention 注意力记忆能力回顾下RNN(也包括LSTM GRU)解决memory问题改进后基于attention注意力的modelmatch操作softmax操作softmax值与hidder layer的值做weight sum 计算和将计算出来的和作为memo…

linux服务器tomcat日志中文出现问号乱码

目录 一、场景二、排查三、原因四、解决 一、场景 tomcat日志的中文出现问号乱码 乱码示例 ??[377995738417729536]????????? ac??????????????message:二、排查 1、使用locale命令查看服务器当前使用的语言包 发现只用的语言包为utf-8&#xff0…

CSDN付费阅读需要哪些条件?

文章目录 前言一、博客等级要求二、原力等级要求结束语 前言 hello,大家好!我是BoBo仔吖,祝大家元宵节快乐呀~ csdn是一个善良的网站,它提供了各种功能空间,比如InsCode运行代码,还有鼓舞大家努力发文的勋…

iOS调用系统已安装地图及内置地图实现

info.plist要添加scheme: 1.地图列表: NSArray *mapKeys=[[NSArray alloc] initWithObjects:@"com.autonavi.minimap",@"com.baidu.BaiduMap",@"com.google.android.apps.maps",@"com.tencent.map", nil]; NSArray *mapSchemes=[[NS…

为什么前端开发变得越来越复杂了?这可能是我们的错

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello,大家好,我是 Sunday。 最近有很多同学来问我:“Sunday 老师,前端学起…

编译GreatSQL with RocksDB引擎

GreatSQL里也能用上RocksDB引擎 1. 前言 RocksDB 是基于Facebook 开源的一种支持事务的、高度可压缩、高性能的MyRocks存储引擎,特别适用于高度压缩和大容量的数据。以下是一些关键特点: 高性能: LSM 树结构使得RocksDB在写入密集型负载下表现…