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

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) 创建型模式关注对象的创建&#xff0…...

日历使用及汉化——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 秒后的内容&#xff0c;可以使用以下命令&#xff1a; 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&#xff1a; 指定输入视频文件 input.mp4。 -t 00:05:49&#x…...

使用系统内NCCL环境重新编译Pytorch

intro&#xff1a; 费了老大劲,来重新编译pytorch&#xff0c;中间报了无数错误。原生的编译好的pytorch是直接用的其自带NCCL库&#xff0c;并且从外部是不能进行插桩的&#xff0c;因为根本找不到libnccl.so文件。下面记录下重新编译pytorch的过程。指定USE_SYSTEM_NCCL1。这…...

1. Klipper从安装到运行

本文记录Klipper固件从安装&#xff0c;配置到运行的详细过程 Klipper是3D打印机固件之一&#xff0c;它通常运行在linux系统&#xff08;常使用Debian&#xff0c;其它的linux版本也可以&#xff09;上&#xff0c;因此需要一个能运行Linux系统的硬件&#xff0c;比如电脑&am…...

docker 卸载与安装

卸载 查询之前安装的docker, 没有查到则不用卸载删除 yum list installed | grep docker 卸载安装包 yum remove docker-* -y 删除镜像、容器、默认挂载卷 rm -rf /var/lib/docker 安装 -ce 安装稳定版本 -y 当安装过程提示选择全部为 "yes" yum install d…...

跨部门文件共享安全:平衡协作与风险的关键策略

在现代企业中&#xff0c;跨部门协作已成为推动业务发展的关键因素。然而&#xff0c;随着信息的自由流动和共享&#xff0c;文件安全风险也随之增加。如何在促进跨部门协作的同时&#xff0c;确保文件共享的安全性&#xff0c;成为了一个亟待解决的问题。 一、明确文件分类与…...

基于单片机的智慧小区人脸识别门禁系统

本设计基于单片机的智慧小区人脸识别门禁系统。由STM32F103C8T6单片机核心板、显示模块、摄像头模块、舵机模块、按键模块和电源模块组成。可以通过摄像头模块对进入人员人脸数据进行采集&#xff0c;识别成功后&#xff0c;舵机模块动作&#xff0c;模拟门禁打开&#xff0c;门…...

【es6】原生js在页面上画矩形及删除的实现方法

画一个矩形&#xff0c;可以选中高亮&#xff0c;删除自己效果的实现&#xff0c;后期会丰富下细节&#xff0c;拖动及拖动调整矩形大小 实现效果 代码实现 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. 背景 在实际的开发工作中&#xff0c;我们往往会面临多任务并行研发&#xff0c;多个环境管理的情况&#xff0c;这种情况下&#xff0c;一个合适的分…...

Redis与MySQL如何保证数据一致性

Redis与MySQL如何保证数据一致性 简单来说 该场景主要发生在读写并发进行时&#xff0c;才会发生数据不一致。 主要流程就是要么先操作缓存&#xff0c;要么先操作Redis&#xff0c;操作也分修改和删除。 一般修改要执行一系列业务代码&#xff0c;所以一般直接删除成本较低…...

基于微信小程序的教室预约系统+LW示例参考

1.项目介绍 功能模块&#xff1a;管理员&#xff08;学生管理、教师管理、申请管理、设备管理、报修管理等&#xff09;、普通用户/学生&#xff08;注册登录、申请预约、退订、报修等&#xff09;技术选型&#xff1a;SSM、JSP、uniapp等测试环境&#xff1a;idea2024&#x…...

Linux 安装 Git 服务器

一、安装 Git 1. 在 CentOS/RHEL 中使用以下命令&#xff1a; sudo yum update -y # 或者 sudo dnf update -y (在较新的系统中) sudo yum install git -y验证安装&#xff1a;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): """ 石头剪刀布游戏&#xff0c;0代表石头&#xff0c;1代见到&#xff0c;2代表石头 …...

深入浅出 WebSocket:构建实时数据大屏的高级实践

简介 请参考下方&#xff0c;学习入门操作 基于 Flask 和 Socket.IO 的 WebSocket 实时数据更新实现 在当今数字化时代&#xff0c;实时性是衡量互联网应用的重要指标之一。无论是股票交易、在线游戏&#xff0c;还是实时监控大屏&#xff0c;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的吃饭问题 思路 签到题&#xff0c;比较大小即可 code void solve(){int a,b,c,d;cin >> a >> b…...

OSPF协议整理

OSPF&#xff08;Open Shortest Path First&#xff09;即开放式最短路径优先协议&#xff0c;是一种广泛应用于大型网络中的链路状态路由协议。 OSPF 的基本概念 OSPF 是基于链路状态算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在一个自治系统&#xff…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...