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特性:利用动态特性(如装饰器、元类)可简化部分模式的实现。
  • 避免过度设计:保持代码清晰易读是设计模式的最终目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另:Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影: 目标投影:与MODIS数据相同(Sinu…

Python3 pip

pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。 软件包也可以在 https://pypi.org/ 中找到。 目前最新的 Python 版本已经预装了 pip。 注意:Python 2.7.9 或 Python 3.4 以上版本都自带 pip 工具。 如果没有安…

docker搭建socks5代理

准备工作 VPS安全组/策略放行相应端口如启用了防火墙,放行相应端口 实际操作 我们选用“历史悠久”的Dante socks5 代理服务器,轻量、稳定。Github也有对dante进行进一步精简的镜像,更为适宜。github项目地址如下: https://gi…

【Leecode】Leecode刷题之路第62天之不同路径

题目出处 62-不同路径-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1:动态规划 思路: 代码示例:(Java&…

如何写一份优质技术文档

作者简介: 本文作者拥有区块链创新专利30,是元宇宙标准化工作组成员、香港web3标准工作组成员,参与编写《数据资产确权与交易安全评价标准》、《链接元宇宙:应用与实践》、《香港Web3.0标准化白皮书》等标准,下面提供…

【Git】Git 完全指南:从入门到精通

Git 完全指南:从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git 都能提供强大的功能来跟踪、管理代码变更,并保障…

系统手势导航-虚拟导航切换

问题讨论-需求场景 何为手势和物理按键、虚拟导航 Android11 开始支持了手势操作,如大家目前手机基本上都是手势操作形式;早期都是物理按键或者虚拟按键的操作。 手势导航和虚拟导航如何选择 系统层面:设置->系统->手势->手势切…

word转pdf

在线xml格式化: 在线 XML 格式化 | 菜鸟工具 Java使用FreeMarker自动生成Word文档(带图片和表单) Java使用FreeMarker自动生成Word文档(带图片和表单)_freemarker word模板-CSDN博客 将word转pdf JAVA 使用aspose…

初识java(4)

今天给大家分享一下java中内置类型定义时的一些要点,我已经整理成笔记,现在分享给大家。 整型变量: 注:在定义int变量时,所赋值不能超过int的范围; 了 intd:1234567890127411编译时报错,初值超过胃int 当你赋值的过而值大于这个变量能够保存的最大值…

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功…

蓝桥杯嵌入式入门指南-ADC【6】

tips:可以不用开启过采样 adc读取函数 float adc_read(ADC_HandleTypeDef *hadc) {uint16_t adc_val;float adc_f;HAL_ADC_Start (hadc);adc_val HAL_ADC_GetValue(hadc);adc_f adc_val*3.3f/4096.0f;return adc_f; }setup()初始化 HAL_ADCEx_Calibration_Start(&hadc2 …

【头歌实训:递归实现斐波那契数列】

头歌实训:递归实现斐波那契数列 文章目录 任务描述相关知识递归相关知识递归举例何时使用递归定义是递归的数据结构是递归的问题的求解方法是递归的 编程要求测试说明源代码: 任务描述 本关任务:递归求解斐波那契数列。 相关知识 为了完成…

【CSP CCF记录】201803-2第13次认证 碰撞的小球

题目 样例输入1 3 10 5 4 6 8 样例输出1 7 9 9 样例输入2 10 22 30 14 12 16 6 10 2 8 20 18 4 样例输出2 6 6 8 2 4 0 4 12 10 2 思路 梳理题意,本题主要考虑三种情况: 1.小球正常运动 2.小球抵达线段两段 3.两个小球在线段某位置相撞 前两种情况很…

ML 系列:第 35 节 - 机器学习中的数据可视化

ML 系列:第 35 天 - 机器学习中的数据可视化 文章目录 一、说明二、数据可视化2.1 直方图2.2 箱线图2.3 散点图2.4 条形图2.5 线图2.6 热图 三、结尾 一、说明 描述性统计和数据可视化是理解和解释机器学习数据的基础。它们有助于总结和直观地呈现数据&#xff0c…

数字化转型背景下,高职院校计算机网络应用的革新策略

在当今信息化时代,计算机网络已经成为高职院校教育不可或缺的一部分,它不仅极大地丰富了教育资源,提高了交流的便捷性,还催生了多样化的教学模式。对于高职院校来说,加强计算机网络应用的建设不仅是顺应时代潮流的必然…

【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作

文章目录 环境配置:搭建开发环境的基础步骤2.1 安装MySQL数据库2.2 配置C/C开发环境2.3 下载并安装MySQL Connector/C 基础操作:实现C/C与MySQL的基本交互3.1 建立数据库连接3.2 执行SQL语句3.3 处理查询结果 进阶技巧:提升数据库操作效率与安…

什么是迁移学习?

一、基本概念 迁移学习(Transfer Learning)是一种机器学习方法,旨在将从一个任务中学到的/已有的知识应用到另一个相关任务中。与传统的机器学习方法不同,迁移学习不需要从头开始训练模型,而是利用(迁移)已有知识来加速…

D83【python 接口自动化学习】- pytest基础用法

day83 pytest测试用例执行顺序 学习日期:20241129 学习目标:http定义及实战 -- pytest测试用例执行顺序 学习笔记: 测试用例执行顺序 默认执行顺序使用pytest-ordering自定义顺序 pytestrequests练习 import requestsdef test_mobile()…

漫谈推理谬误——错误因果

相关文章 漫谈推理谬误——错误假设-CSDN博客文章浏览阅读736次,点赞22次,收藏3次。在日常生活中,我们会面临各种逻辑推理,有些看起来一目了然,有些非常的科学严谨,但也有很多似是而非,隐藏了陷…

如何看linux系统内核是aarch64 ,还是64-bit

要查看 Linux 系统内核是 aarch64 架构还是 64-bit 架构,可以通过以下几种方法来确认: 方法 1:使用 uname 命令 uname 命令用于显示系统信息。使用以下命令查看系统的架构: uname -m如果输出是 aarch64,说明你的系统…