基于python的23种设计模式
以下是基于Python实现的23种设计模式及代码段和详细解释:
1. 工厂模式(Factory Pattern)
简介
工厂模式是一种创建型设计模式,它允许客户端代码通过工厂方法创建对象,而无需直接实例化对象。在工厂方法模式中,我们定义一个工厂方法来创建对象,而不是使用类的构造函数。
代码段
from abc import ABC, abstractmethodclass Product(ABC):"""抽象产品类,定义所有具体产品的接口"""@abstractmethoddef operation(self) -> str:passclass ConcreteProduct(Product):"""具体产品类"""def operation(self) -> str:return "ConcreteProduct"class Creator(ABC):"""抽象创建者类,声明工厂方法,返回一个产品类的实例"""@abstractmethoddef factory_method(self) -> Product:passdef some_operation(self) -> str:"""可选:创建者还可以提供一些默认实现"""product = self.factory_method()result = f"Creator: {product.operation()}"return resultclass ConcreteCreator1(Creator):"""具体创建者1,实现工厂方法以返回具体产品1的实例"""def factory_method(self) -> Product:return ConcreteProduct()class ConcreteCreator2(Creator):"""具体创建者2,实现工厂方法以返回具体产品2的实例"""def factory_method(self) -> Product:return ConcreteProduct()def client_code(creator: Creator) -> None:"""客户端代码只需要知道创建者的抽象类,无需关心具体实现类"""print(f"Client: I'm not aware of the creator's class, but it still works.\n"f"{creator.some_operation()}", end="")if __name__ == "__main__":print("App: Launched with the ConcreteCreator1.")client_code(ConcreteCreator1())
解释
该代码段演示了工厂模式,其中有一个抽象产品类和其具体实现类。还有一个抽象创建者类来声明工厂方法和可选的默认实现。具体创建类实现工厂方法以返回具体产品类的实例。客户端代码调用抽象创建者而不是具体创建子类。
2. 抽象工厂模式(Abstract Factory Pattern)
简介
抽象工厂是一种创建型设计模式,它允许您创建一组相关的对象,而无需指定其具体类。抽象工厂定义了一个接口,用于创建相关的对象,而不指定具体类。
代码段
from abc import ABC, abstractmethodclass AbstractFactory(ABC):"""抽象工厂类,声明所有产品创建方法。"""@abstractmethoddef create_product_a(self):pass@abstractmethoddef create_product_b(self):passclass ConcreteFactory1(AbstractFactory):"""具体工厂1,生成一组具有相互依赖关系的产品。"""def create_product_a(self):return ConcreteProductA1()def create_product_b(self):return ConcreteProductB1()class ConcreteFactory2(AbstractFactory):"""具体工厂2,生成一组具有相互依赖关系的产品。"""def create_product_a(self):return ConcreteProductA2()def create_product_b(self):return ConcreteProductB2()class AbstractProductA(ABC):"""抽象产品A类,定义具体产品共有的方法"""@abstractmethoddef useful_function_a(self) -> str:passclass AbstractProductB(ABC):"""抽象产品B类,定义具体产品共有的方法"""@abstractmethoddef useful_function_b(self) -> None:pass@abstractmethoddef another_useful_function_b(self, collaborator: AbstractProductA) -> None:passclass ConcreteProductA1(AbstractProductA):"""具体产品A1,实现抽象产品A类的接口"""def useful_function_a(self) -> str:return "The result of the product A1."class ConcreteProductA2(AbstractProductA):"""具体产品A2,实现抽象产品A类的接口"""def useful_function_a(self) -> str:return "The result of the product A2."class ConcreteProductB1(AbstractProductB):"""具体产品B1,实现抽象产品B类的接口"""def useful_function_b(self) -> str:return "The result of the product B1."def another_useful_function_b(self, collaborator: AbstractProductA) -> str:"""B1实现了与特定产品A相关的功能。"""result = collaborator.useful_function_a()return f"The result of the B1 collaborating with the ({result})"class ConcreteProductB2(AbstractProductB):"""具体产品B2,实现抽象产品B类的接口"""def useful_function_b(self) -> str:return "The result of the product B2."def another_useful_function_b(self, collaborator: AbstractProductA) -> str:"""B2实现了与特定产品A相关的功能。"""result = collaborator.useful_function_a()return f"The result of the B2 collaborating with the ({result})"def client_code(factory: AbstractFactory) -> None:"""客户端代码仅与抽象工厂及其产品接口一起使用。"""product_a = factory.create_product_a()product_b = factory.create_product_b()print(f"{product_b.useful_function_b()}")print(f"{product_b.another_useful_function_b(product_a)}", end="")if __name__ == "__main__":print("Client: Testing client code with the first factory type...")client_code(ConcreteFactory1())print("\n")print("Client: Testing the same client code with the second factory type...")client_code(ConcreteFactory2())
解释
该代码段演示了抽象工厂模式,其中有一个抽象工厂类和多个实现不同产品分类的具体工厂类。每个工厂类都实现了工厂方法来生产不同类型的产品。每个产品类实现了共同的抽象产品接口。客户端代码只与抽象工厂和产品接口一起使用,而不需要关心具体实现类。
3. 建造者模式(Builder Pattern)
简介
建造者模式是一种创建型设计模式,它允许您使用相同的构建代码生成不同类型和形式的对象。建造者模式的精髓在于将对象构建过程与其表示分离。
代码段
from abc import ABC, abstractmethod
from typing import Anyclass Builder(ABC):"""抽象建造者类,声明所有产品构建步骤。"""@abstractmethoddef produce_part_a(self) -> None:pass@abstractmethoddef produce_part_b(self) -> None:pass@abstractmethoddef produce_part_c(self) -> None:pass@abstractmethoddef get_result(self) -> Any:passclass ConcreteBuilder1(Builder):"""具体建造者类1,实现所有产品构建方法,并返回最终结果。"""def __init__(self) -> None:self.reset()def reset(self) -> None:self.product = Product1()def produce_part_a(self) -> None:self.product.add("PartA1")def produce_part_b(self) -> None:self.product.add("PartB1")def produce_part_c(self) -> None:self.product.add("PartC1")def get_result(self) -> Product1:result = self.productself.reset()return resultclass ConcreteBuilder2(Builder):"""具体建造者类2,实现所有产品构建方法,并返回最终结果。"""def __init__(self) -> None:self.reset()def reset(self) -> None:self.product = Product2()def produce_part_a(self) -> None:self.product.add("PartA2")
相关文章:
基于python的23种设计模式
以下是基于Python实现的23种设计模式及代码段和详细解释: 1. 工厂模式(Factory Pattern) 简介 工厂模式是一种创建型设计模式,它允许客户端代码通过工厂方法创建对象,而无需直接实例化对象。在工厂方法模式中&#…...
屏幕录制视频编辑软件 Camtasia 2023 mac中文版软件功能
Camtasia 2023 mac是一款功能强大的屏幕录制和视频编辑软件,可以用于制作教育课程、演示文稿、培训视频等。它具有一系列工具和功能,包括屏幕录制、视频编辑、音频编辑、字幕、特效等,使用户可以轻松地创建高质量的视频内容。 Camtasia2023的…...
关于spring的xml文件中的xmlns,xsi,schemaLocation
关于spring xml文件中的xmlns,xsi:schemaLocation 首先我们看到的一个spring的配置文件大概如下面这个样子: <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans" //这表…...
mac-“准备安装时发生错误,请尝试重新运行此应用程序” + mac未能安装所需的固件更新
参考链接:参考 u盘安装时候遇到问题: 安装系统时候报错 解决方案: 根据u盘系统上进行格式化磁盘,(我选择的是APFS),命名Macintosh HD 抹完之后选择急救下。 然后退出磁盘工具,点击…...
二叉搜索树的详解及Map和Set的介绍
目录 1.二叉搜索树 1.1二叉搜索树的介绍 1.2.二叉搜索树的实现 1.2.1二叉搜索树的创建 1.2.2查找关键字 1.2.3插入 1.2.4删除 1.3二叉搜索树的性能分析 2.Map Map官方文档 2.1Map 的常用方法说明 2.2关于Map.Entry的说明,> 2.3注意事项 2.4reeMap和HashMap的区别 …...
【Android知识笔记】JNI专题
一、JNI 基础知识 JNI 的数据类型以及和Java层之间的数据转换 前面总结了一篇,这里不再展开,可以参考: JNI 的数据类型以及和Java层之间的数据转换 注:这些知识都收集自网络文章,比较零散,对于JNI基础来说应该够用了。主要是一些API的使用,记不住时当成手册来查询一下…...
C++面试题目汇总【持续更新】
面试题目汇总 C基础1. 面向对象是什么?[GPT]2. 面向对象的三大特征是什么?[GPT]3. 重载,重写,隐藏的区别?[GPT]4. 构造函数的类别有哪些?[GPT]5. 定义一个空类时,默认生成哪些函数?[…...
【PXIE301-211】青翼科技基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台
板卡概述 PXIE301-211是一款基于PXIE总线架构的16路并行LVDS数据采集、1路光纤收发处理平台,该板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器,实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡具有1个FMC…...
WPF实现签名拍照功能
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程的集成方法与步骤(二)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 前面讲了集成的后端部分内容,下面简单介绍一下前端的内容 1、前端生成的页面需要进行修改&…...
【Qt控件之微调框、进度条】QSpinBox、QDoubleSpinBox、QDial、QProgressBar介绍及使用
概述 QSpinBox类提供了一个微调框小部件。 QSpinBox适用于处理整数和离散的值集(例如,月份名称);对于浮点数值,请使用QDoubleSpinBox。 QSpinBox允许用户通过点击上下按钮或按键盘上的上下箭头来增加/减少当前显示的值…...
Python学习-----Day09
一、利用装饰器来获取函数运行的时间、 #导入time模块 import timedef decorated(fn):def inner():#time.time获取函数执行的时间a time.time() # func开始的时间fn()b time.time() # func结束的时间print(f"{fn.__name__}程序运行的总数时间:{b - a}秒")return…...
世界国家/地区行驶方向数据
Part1数据背景 道路通行方向规则是交通规则的重要部分之一。不同国家及地区通行方向并不一样,受风俗、习惯、风潮因素等影响。 最近也在学道路行驶,结果差强人意,继续努力吧。祝学车的小伙伴们一次过~ Part2数据详情 今天分享的国家/地区行…...
idgen导入Android11源码
文章目录 配置下载AS编译源码依赖导入玩一下andorid.iml 注意: 有些时候发现为啥自己编译就这么难呢?不是卡死就无数次重启虚拟机,一切的原罪在配置过低,换句话说就是穷。关于导入源码的下载参考 Android Studio for Platform (AS…...
大同小异!如何在苹果不同类型设备上更改AirDrop的名称
你可以更改你的AirDrop ID,让其他人看到你名字之外的东西。本文介绍了如何在iPhone、iPad和Mac上更改AirDrop名称。 如何在iPhone上更改AirDrop名称 在iPhone上更改AirDrop名称涉及到你可能不想做的更改。幸运的是,这在iPad和Mac上不是真的,…...
sqlmap --os-shell选项原理解析
文章目录 sqlmap --os-shell选项原理解析原理解析总结 sqlmap --os-shell选项原理解析 以sqli第一关为例。 --os-shell 是 SQLMap 工具的一个参数,用于在成功注入数据库后,执行操作系统命令并获取其输出。 sqlmap -u "http://192.168.188.199/sq…...
谈谈 Redis 持久化机制,RDB、AOF
谈谈 Redis 持久化机制,RDB,AOF RDB:相当于对内存中的数据,拍一张数据快照。存储的是数据。 AOF:存储的是具体的命令。 企业实践中,实际是使用RDB结合AOF。 这个方法是在 Redis 4.0 提出的,该方…...
并发编程——2.基础概念及其它相关的概述
这篇文章我们来讲一下并发编程中的线程及其相关的概述内容。 目录 1.J.U.C 2.进程、线程、协程 2.1进程 2.2线程 2.3纤程(协程) 2.4概念小结 3.并发、并行、串行 3.1并发 3.2并行 3.3串行 3.4概念小结 4.CPU核心数和线程数的关系 5.上下文…...
20231019 filezilla 配置 Windows与Ubuntu文件传输
SFTP协议,传文件,否则会报无权限错...
一个.Net开发的轻量级SQLite数据库ORM
SQLite是一种流行的开源关系型数据库,它的设计目标是提供轻量级、高效、可靠和易用的数据存储服务。由于SQLite无需单独的服务器进程,它通常被用于嵌入式系统和单机应用程序中,也可以用于网络应用程序的辅助数据库。 今天给大家推荐一个.NET开…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
