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

python——常见创建型设计模式

创建型设计模式(Creational Design Patterns) 是一类用于创建对象的设计模式,旨在解决对象创建时的复杂性,并确保创建过程满足设计需求。这些模式通过封装实例化过程,使得代码在创建对象时更加灵活、可扩展,并降低了与对象创建相关的耦合性。

创建型设计模式的特点

  • 解耦创建过程:将对象创建的具体细节隐藏起来,使得系统能够在不影响其使用的情况下轻松改变对象的创建方式。
  • 复用性:能够避免重复创建对象,节省资源。
  • 灵活性:通过模式的使用,可以灵活应对不同的创建场景,保证系统的扩展性。

创建型设计模式常见的几种模式包括单例模式(Singleton Pattern)工厂模式(Factory Pattern)原型模式(Prototype Pattern)建造者模式(Builder Pattern),以及Monostate 模式

三个常见的创建型设计模式:

1. 单例模式(Singleton Pattern)
原理

单例模式确保一个类只有一个实例,并提供一个全局访问点。它通常用于共享资源(如数据库连接、配置管理等),避免在系统中创建多余的对象。

示例

我们通过元类和装饰器实现了单例模式,这些方法都确保无论实例化多少次,程序中始终只存在一个实例。

# 使用元类实现单例模式
class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)return cls._instances[cls]class Singleton(metaclass=SingletonMeta):def __init__(self):self.value = 42s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # True,表明s1和s2是同一实例
使用场景
  • 全局配置:系统中只需要一个配置对象,避免重复配置和不一致。
  • 日志记录器:全局共享一个日志对象,避免多个日志文件或记录器的混乱。
好处
  • 控制实例数量:确保系统只创建一个对象,避免资源浪费。
  • 全局访问点:系统中可以轻松地访问单例对象,简化代码结构。

2. 通过 import 实现单例
原理

在 Python 中,模块在首次 import 时被加载到内存中,之后的 import 只是返回之前加载的对象。因此,利用模块的这一特性,能够实现全局共享的单例模式。

示例
# config.py
class Config:def __init__(self):self.value = 42config = Config()# main.py
from config import configprint(config.value)  # 42
config.value = 100# other.py
from config import configprint(config.value)  # 100,表明在不同模块中共享同一实例
使用场景
  • 全局状态管理:当程序中的某个状态或配置需要在多个模块间共享时,使用 import 实现单例能够保证一致性。
  • 资源管理:通过模块实现的单例模式,确保系统中的资源(如文件句柄、数据库连接等)不会被多次创建。
好处
  • 简单易用import 本身就是一种单例模式的实现,不需要额外的代码逻辑来确保对象的唯一性。
  • 全局访问:通过 import,在任何地方都可以访问同一个对象实例。

3. Monostate 模式(共享状态)
原理

Monostate 模式与单例模式类似,但不同之处在于 Monostate 模式允许创建多个实例,这些实例共享相同的状态。状态保存在类属性中,而不是实例属性中。

示例

我们之前展示了如何通过类属性共享状态,以及如何使用 @property@<variable>.setter 装饰器来控制属性的访问和修改。

class Monostate:_shared_state = {"_value": 42}def __init__(self):self.__dict__ = self._shared_state@propertydef value(self):return self._shared_state["_value"]@value.setterdef value(self, new_value):if new_value < 0:raise ValueError("Value cannot be negative")self._shared_state["_value"] = new_value# 测试 Monostate 模式
instance1 = Monostate()
instance2 = Monostate()instance1.value = 100
print(instance2.value)  # 输出 100,表明两个实例共享相同的状态
使用场景
  • 对象间共享状态:当需要多个对象共享某些全局状态或配置,但仍希望这些对象可以被单独实例化时,可以使用 Monostate 模式。
  • 分布式系统:在需要多个实例共享状态的场景中,如集群中的状态同步。
好处
  • 灵活性:Monostate 模式允许创建多个对象,但保持共享的状态,使其比传统的单例模式更加灵活。
  • 状态一致性:通过共享类属性,确保所有实例在状态上保持一致。
使用 @property@<variable>.setter 的好处
  • 封装访问控制:通过 @property@setter,可以对共享的状态进行更加严格的控制和验证。
  • 更好的代码可维护性:这些装饰器使得状态的访问和修改更加直观,提高了代码的可读性。

总结

  1. 单例模式(Singleton Pattern):保证系统中只有一个实例,适合用于全局状态、资源共享的场景。可以通过元类或装饰器实现单例。

  2. 通过 import 实现单例:利用 Python 模块的天然单例特性,简化全局对象的管理,适用于全局配置、资源共享等场景。

  3. Monostate 模式(共享状态):允许多个实例共享状态,而不是共享同一个对象。通过类属性的方式,多个对象可以在状态上保持一致性,适用于多个实例需要共享状态的场景。

这些创建型模式有效地解决了对象创建的复杂性问题,使代码在面临复杂对象创建需求时更具灵活性和扩展性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 仿RabbitMq实现简易消息队列正式篇(路由匹配篇)
  • BFS解决单源最短路问题
  • MySql 高阶二(SQL 性能分析)
  • QT翻金币小游戏(含音频图片文件资源)
  • c#使用Microsoft.Office.Interop.Word提示无法嵌入或操作型“ApplicationClass”。请改用试用的接口。
  • day45-dynamic programming-part12-8.16
  • Python、R用RFM模型、机器学习对在线教育用户行为可视化分析|附数据、代码
  • 【排序算法】八大排序(上)(c语言实现)(附源码)
  • [Linux] 关于执行文件路径的变量:$PATH
  • SpringBoot自定义类加载器
  • linux查看网卡速度和pcie速度
  • 【Python零基础】while循环和用户输入
  • SPI驱动学习一(协议原理)
  • 硬件服务器操作系统的选择:Linux 还是 Windows?
  • 地理科学专业| 中国大学排行榜(2024年)
  • C++类的相互关联
  • CentOS7 安装JDK
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Hibernate【inverse和cascade属性】知识要点
  • HTTP请求重发
  • java概述
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mockjs让前端开发独立于后端
  • Node 版本管理
  • rabbitmq延迟消息示例
  • unity如何实现一个固定宽度的orthagraphic相机
  • 阿里云前端周刊 - 第 26 期
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 猴子数据域名防封接口降低小说被封的风险
  • 一个SAP顾问在美国的这些年
  • 最近的计划
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​低代码平台的核心价值与优势
  • #14vue3生成表单并跳转到外部地址的方式
  • #define用法
  • $().each和$.each的区别
  • (145)光线追踪距离场柔和阴影
  • (搬运以学习)flask 上下文的实现
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (源码分析)springsecurity认证授权
  • (转)JAVA中的堆栈
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 的缓存方案
  • .net core控制台应用程序初识
  • .net FrameWork简介,数组,枚举
  • .NET Micro Framework初体验
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .net实现客户区延伸至至非客户区
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Async 异步注解使用
  • @JsonFormat与@DateTimeFormat注解的使用
  • @Not - Empty-Null-Blank
  • [.net] 如何在mail的加入正文显示图片