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),用于在一个自治系统ÿ…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
