结构型设计模式-元享(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

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构