Python中的23种设计模式:详细分类与总结
设计模式是解决特定问题的通用方法,分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍,包括其核心思想、应用场景和优缺点。
一、创建型模式(Creational Patterns)
创建型模式关注对象的创建,旨在解耦对象的创建过程,提高灵活性和可扩展性。
1. 单例模式(Singleton)
核心思想:确保一个类只有一个实例,并提供全局访问点。
应用场景:数据库连接、配置管理器、日志记录器。
优缺点:简单高效,但在多线程环境中需注意同步。
2. 工厂模式(Factory Method)
核心思想:定义一个创建对象的接口,由子类决定具体的实例化逻辑。
应用场景:需要根据条件动态创建不同对象时。
优缺点:增强代码扩展性,但可能增加类的数量。
3. 抽象工厂模式(Abstract Factory)
核心思想:提供一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。
应用场景:需要创建一组相关对象(如跨平台UI控件)。
优缺点:提高模块独立性,但复杂性增加。
4. 生成器模式(Builder)
核心思想:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
应用场景:构建复杂对象(如HTML文档生成、游戏场景构建)。
优缺点:灵活构建复杂对象,但实现较复杂。
5. 原型模式(Prototype)
核心思想:通过复制(克隆)现有对象来创建新对象,而不是通过类实例化。
应用场景:需要大量相似对象时(如图形编辑器中的图元复制)。
优缺点:提高对象创建效率,但需实现对象的深浅拷贝。
二、结构型模式(Structural Patterns)
结构型模式注重对象或类之间的组合关系,旨在优化系统结构的可维护性和扩展性。
6. 适配器模式(Adapter)
核心思想:将一个类的接口转换为客户端期望的接口,实现接口兼容。
应用场景:集成第三方库或遗留代码。
优缺点:增加兼容性,但可能导致系统复杂化。
7. 桥接模式(Bridge)
核心思想:分离抽象部分与实现部分,使它们可以独立变化。
应用场景:跨平台工具(如多平台图形绘制API)。
优缺点:增强灵活性,但设计复杂。
8. 组合模式(Composite)
核心思想:将对象组合成树形结构以表示“部分-整体”关系,使得客户端对单个对象和组合对象一致处理。
应用场景:文件系统、组织结构。
优缺点:简化客户端操作,但复杂度增加。
9. 装饰器模式(Decorator)
核心思想:动态地为对象添加职责,而无需修改其结构。
应用场景:功能扩展(如日志、权限检查)。
优缺点:灵活性强,但对象嵌套可能增加调试难度。
10. 外观模式(Facade)
核心思想:为子系统提供统一的接口,简化子系统的使用。
应用场景:复杂系统的简化接口(如数据库操作封装)。
优缺点:降低客户端复杂性,但可能隐藏系统细节。
11. 享元模式(Flyweight)
核心思想:通过共享减少对象内存开销,适用于大量细粒度对象。
应用场景:文字处理器中字符管理、棋盘游戏中的棋子。
优缺点:内存效率高,但需要保证对象的不可变性。
12. 代理模式(Proxy)
核心思想:为对象提供一个代理,以控制对其访问。
应用场景:远程代理、虚拟代理、安全代理。
优缺点:控制灵活性增加,但引入额外层次。
三、行为型模式(Behavioral Patterns)
行为型模式关注对象之间的职责分配和交互模式,优化系统的动态行为。
13. 模板方法模式(Template Method)
核心思想:定义算法的骨架,将具体步骤延迟到子类实现。
应用场景:数据处理流程、钩子机制。
优缺点:代码复用高,但灵活性有限。
14. 命令模式(Command)
核心思想:将请求封装为对象,从而支持请求的保存、撤销或重放。
应用场景:事务操作、撤销/重做功能。
优缺点:解耦请求与实现,但可能增加类的数量。
15. 迭代器模式(Iterator)
核心思想:提供一种顺序访问集合元素的方法,而不暴露其内部结构。
应用场景:自定义集合类遍历。
优缺点:简化集合遍历,但可能性能较低。
16. 观察者模式(Observer)
核心思想:定义一对多依赖关系,当一个对象状态改变时通知所有依赖者。
应用场景:事件通知机制(如发布-订阅模式)。
优缺点:解耦观察者与被观察者,但通知链可能复杂。
17. 中介者模式(Mediator)
核心思想:通过中介者对象封装一组对象之间的交互,降低耦合性。
应用场景:UI组件通信、消息总线系统。
优缺点:降低耦合性,但中介者可能变得复杂。
18. 备忘录模式(Memento)
核心思想:捕获对象状态并在以后恢复,保护数据完整性。
应用场景:撤销操作、游戏存档。
优缺点:提高数据安全性,但增加存储开销。
19. 解释器模式(Interpreter)
核心思想:为特定语言或表达式定义一个解释器。
应用场景:规则引擎、脚本语言解析器。
优缺点:适用于特定领域,但扩展性较差。
20. 策略模式(Strategy)
核心思想:定义一系列算法,将每种算法封装在独立类中,并使它们可以互换。
应用场景:动态选择算法(如支付方式)。
优缺点:灵活性强,但增加维护复杂性。
21. 状态模式(State)
核心思想:允许对象在内部状态改变时改变行为。
应用场景:状态机(如订单状态、角色状态)。
优缺点:状态逻辑清晰,但状态类可能增多。
22. 责任链模式(Chain of Responsibility)
核心思想:将请求沿着处理者链传递,直到某个处理者处理该请求。
应用场景:日志处理链、权限校验链。
优缺点:降低耦合性,但链路调试复杂。
23. 访问者模式(Visitor)
核心思想:将操作封装到访问者对象中,以便在不改变对象结构的前提下添加新功能。
应用场景:复杂对象结构操作(如语法树分析)。
优缺点:扩展性好,但依赖对象结构稳定。
分类汇总表
| 类别 | 模式名称 |
|---|---|
| 创建型模式 | 单例模式、工厂模式、抽象工厂模式、生成器模式、原型模式 |
| 结构型模式 | 适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、代理模式 |
| 行为型模式 | 模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、策略模式、状态模式、责任链模式、访问者模式 |
设计模式的选择
- 适用场景:根据实际需求选择适当的模式,避免不必要的复杂性。
- Python特性:利用动态特性(如装饰器、元类)可简化部分模式的实现。
- 避免过度设计:保持代码清晰易读是设计模式的最终目的。
相关文章:
Python中的23种设计模式:详细分类与总结
设计模式是解决特定问题的通用方法,分为创建型模式、结构型模式和行为型模式三大类。以下是对每种模式的详细介绍,包括其核心思想、应用场景和优缺点。 一、创建型模式(Creational Patterns) 创建型模式关注对象的创建࿰…...
日历使用及汉化——fullcalendar前端
官网 FullCalendar - JavaScript Event Calendar 引入项目 <link hrefhttps://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.1/main.min.css relstylesheet /><script srchttps://cdnjs.cloudflare.com/ajax/libs/fullcalendar/5.10.1/main.min.js></sc…...
视频截断,使用 FFmpeg
使用 FFmpeg 截取视频并去掉 5 分 49 秒后的内容,可以使用以下命令: ffmpeg -i input.mp4 -t 00:05:49 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4-i input.mp4: 指定输入视频文件 input.mp4。 -t 00:05:49&#x…...
使用系统内NCCL环境重新编译Pytorch
intro: 费了老大劲,来重新编译pytorch,中间报了无数错误。原生的编译好的pytorch是直接用的其自带NCCL库,并且从外部是不能进行插桩的,因为根本找不到libnccl.so文件。下面记录下重新编译pytorch的过程。指定USE_SYSTEM_NCCL1。这…...
1. Klipper从安装到运行
本文记录Klipper固件从安装,配置到运行的详细过程 Klipper是3D打印机固件之一,它通常运行在linux系统(常使用Debian,其它的linux版本也可以)上,因此需要一个能运行Linux系统的硬件,比如电脑&am…...
docker 卸载与安装
卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…...
跨部门文件共享安全:平衡协作与风险的关键策略
在现代企业中,跨部门协作已成为推动业务发展的关键因素。然而,随着信息的自由流动和共享,文件安全风险也随之增加。如何在促进跨部门协作的同时,确保文件共享的安全性,成为了一个亟待解决的问题。 一、明确文件分类与…...
基于单片机的智慧小区人脸识别门禁系统
本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集,识别成功后,舵机模块动作,模拟门禁打开,门…...
【es6】原生js在页面上画矩形及删除的实现方法
画一个矩形,可以选中高亮,删除自己效果的实现,后期会丰富下细节,拖动及拖动调整矩形大小 实现效果 代码实现 class Draw {constructor() {this.x 0this.y 0this.disX 0this.disY 0this.startX 0this.startY 0this.mouseDo…...
【git实践】分享一个适用于敏捷开发的分支管理策略
文章目录 1. 背景2. 分支管理实践2.1. 敏捷开发中分支管理面临的问题2.2. 分支管理策略2.3. 还需要注意的一些问题 3.总结 1. 背景 在实际的开发工作中,我们往往会面临多任务并行研发,多个环境管理的情况,这种情况下,一个合适的分…...
Redis与MySQL如何保证数据一致性
Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时,才会发生数据不一致。 主要流程就是要么先操作缓存,要么先操作Redis,操作也分修改和删除。 一般修改要执行一系列业务代码,所以一般直接删除成本较低…...
基于微信小程序的教室预约系统+LW示例参考
1.项目介绍 功能模块:管理员(学生管理、教师管理、申请管理、设备管理、报修管理等)、普通用户/学生(注册登录、申请预约、退订、报修等)技术选型:SSM、JSP、uniapp等测试环境:idea2024&#x…...
Linux 安装 Git 服务器
一、安装 Git 1. 在 CentOS/RHEL 中使用以下命令: sudo yum update -y # 或者 sudo dnf update -y (在较新的系统中) sudo yum install git -y验证安装:git --version 2. 配置 Git 用户 git config --global user.name "Your Name" git co…...
总结:Yarn资源管理
一、介绍 本文梳理下Yarn的资源分配计算逻辑。 二、配置 - 资源限制 1、配置NodeManager可分配的资源池的总量 <property><name>yarn.nodemanager.resource.memory-mb</name><value>4096</value> </property> 作用对象:节点管理器(No…...
Python学习34天
import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏,0代表石头,1代见到,2代表石头 …...
深入浅出 WebSocket:构建实时数据大屏的高级实践
简介 请参考下方,学习入门操作 基于 Flask 和 Socket.IO 的 WebSocket 实时数据更新实现 在当今数字化时代,实时性是衡量互联网应用的重要指标之一。无论是股票交易、在线游戏,还是实时监控大屏,WebSocket 已成为实现高效、双向…...
三开关VUE组件
一、使用效果 <template><QqThreeSwitch v-model"value" /><!-- <SqThreeSwitch v-model"value" :options"[test1, test2, test3]"><template #left-action><div style"display: flex"><IconMoon…...
SpringCloud+SpringCloudAlibaba学习笔记
SpringCloud 服务注册中心 eureka ap 高可用 分布式容错 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency><groupId…...
牛客小白月赛105(A~E)
文章目录 A lz的吃饭问题思路code B lz的数字问题思路code C lz的蛋挞问题思路code D lz的染色问题思路code E lz的括号问题思路code 总结 牛客小白月赛105 A lz的吃饭问题 思路 签到题,比较大小即可 code void solve(){int a,b,c,d;cin >> a >> b…...
OSPF协议整理
OSPF(Open Shortest Path First)即开放式最短路径优先协议,是一种广泛应用于大型网络中的链路状态路由协议。 OSPF 的基本概念 OSPF 是基于链路状态算法的内部网关协议(IGP),用于在一个自治系统ÿ…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
