结构型设计模式-元享(flyweight)模式-python实现

2024-09-06 04:36

本文主要是介绍结构型设计模式-元享(flyweight)模式-python实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

设计模式汇总:查看

通俗示例

想象一下你正在经营一家图书馆,图书馆里有成千上万本书。如果每本书都是一个独立的对象,那么它们将占用大量的内存空间,因为每本书都包含一些相同的信息,比如出版商、出版年份等。为了节省内存,你可以采用一种方式,即只创建一个出版商和出版年份的实例,然后让所有书共享这些信息。这种做法在软件设计中就类似于“元享模式”。

通俗解释

元享模式是一种结构型设计模式,它通过共享尽可能多的相似对象来减少内存的使用。在元享模式中,将对象的属性分为“内在状态”和“外在状态”。内在状态是存储在享元对象中的,它们是固定的,不随环境的改变而改变;而外在状态则是根据环境变化而变化的,通常不会存储在享元对象中。

元享模式的关键组成包括:

  • 享元(Flyweight):代表共享的对象,它存储了内在状态。
  • 享元工厂(Flyweight Factory):负责创建和管理享元对象,确保享元对象被共享。
  • 客户端(Client):负责维护享元对象的外在状态,并使用享元对象进行操作。

元享模式的优点

  • 减少内存使用:通过共享相似对象,减少内存占用。
  • 提高性能:对象的创建和销毁需要时间和资源,共享对象可以减少这些开销。
  • 提高扩展性:元享模式使得添加新的享元对象变得更容易,因为不需要修改现有的代码。

Python代码示例

以下是一个元享模式的简单实现,以图书为例:

# 享元类
class Book:def __init__(self, title, *args, **kwargs):self.title = titledef borrow(self):print(f"{self.title} is borrowed.")# 享元工厂
class BookFactory:_books = {}def get_book(self, title, author, year_published):key = (title, author, year_published)if key not in self._books:self._books[key] = Book(title)return self._books[key]# 客户端代码
if __name__ == "__main__":factory = BookFactory()# 创建图书book1 = factory.get_book("The Great Gatsby", "F. Scott Fitzgerald", 1925)book2 = factory.get_book("The Great Gatsby", "F. Scott Fitzgerald", 1925)# 检查两本书是否相同print(book1 is book2)  # 输出 True,说明两本书对象是同一个实例# 借书book1.borrow()

在这个例子中,Book是享元类,BookFactory是享元工厂。当我们尝试从工厂获取两本相同的书时(即具有相同的标题、作者和出版年份),工厂只会创建一个Book实例,并让这两本书共享这个实例。

总结

元享模式适用于那些需要大量相似对象的应用场景,通过共享对象来降低内存的使用,提高程序的性能。它特别适用于如文本编辑器、图形编辑器和游戏开发等,这些场景中通常需要创建大量的对象实例。在使用元享模式时,需要注意内在状态和外在状态的划分,确保正确地共享对象。

这篇关于结构型设计模式-元享(flyweight)模式-python实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141011

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2