23种设计模式全面解析

设计模式是解决软件设计中常见问题的经典方案。根据《设计模式:可复用面向对象软件的基础》(GoF),23种设计模式分为以下三类:


一、创建型模式(5种)

目标:解耦对象的创建过程,提高系统灵活性

模式名称核心思想典型应用场景
工厂方法定义创建对象的接口,子类决定实例化哪个类数据库连接器、日志记录器
抽象工厂创建相关或依赖对象的家族,不指定具体类GUI组件库、跨平台系统适配
建造者分步构建复杂对象,分离构造与表示XML解析器、游戏角色生成器
原型通过克隆现有对象来创建新对象对象初始化成本高时的复制操作
单例确保类只有一个实例,提供全局访问点配置管理器、线程池、缓存系统

二、结构型模式(7种)

目标:组合类或对象形成更大的结构

模式名称核心思想典型应用场景
适配器转换接口使不兼容类协同工作旧系统集成、第三方库封装
桥接分离抽象与实现,允许独立变化跨平台绘图引擎、设备驱动程序
组合以树形结构处理整体-部分关系文件系统、GUI容器控件
装饰器动态添加职责,替代继承扩展功能IO流增强、游戏装备系统
外观为复杂子系统提供统一的高层接口API网关、框架入口类
享元共享细粒度对象,减少内存消耗文字编辑器字符对象、棋牌游戏棋子
代理为其他对象提供访问代理,控制访问远程调用、虚拟文件系统、权限控制

三、行为型模式(11种)

目标:优化对象间的通信与职责分配

模式名称核心思想典型应用场景
责任链将请求沿处理链传递,直到被处理审批流程、异常处理机制
命令封装请求为对象,支持撤销/重做操作事务系统、GUI操作历史记录
解释器定义语法的表示与解释方式正则表达式引擎、SQL解析器
迭代器提供顺序访问集合元素的方法集合遍历、树形结构遍历
中介者通过中介对象封装对象间交互聊天室系统、空中交通管制系统
备忘录捕获并保存对象内部状态,支持状态回滚文档版本控制、游戏存档系统
观察者定义对象间的一对多依赖关系(事件驱动)股票行情通知、GUI事件处理
状态封装状态相关行为,允许运行时状态切换订单状态机、游戏角色状态管理
策略定义算法族,使其可互相替换支付方式选择、排序算法切换
模板方法定义算法骨架,子类重写特定步骤框架扩展点、业务流程标准化
访问者在不修改类的前提下为类添加新操作编译器语法树分析、报表生成器

四、模式选择指南

  1. 创建型场景

    • 需要灵活控制对象创建过程 → 工厂/建造者模式
    • 全局唯一访问点 → 单例模式
    • 复杂对象复制 → 原型模式
  2. 结构型场景

    • 接口不兼容 → 适配器模式
    • 动态功能扩展 → 装饰器模式
    • 资源优化 → 享元模式
  3. 行为型场景

    • 事件驱动系统 → 观察者模式
    • 算法切换 → 策略模式
    • 状态管理 → 状态模式
    • 操作记录 → 命令模式

五、经典模式对比

对比维度工厂方法 vs 抽象工厂装饰器 vs 代理策略 vs 状态
核心区别生产单个对象 vs 对象家族增强功能 vs 控制访问算法替换 vs 状态驱动行为变化
扩展方向垂直扩展(子类化)横向扩展(功能叠加)算法扩展 vs 状态扩展
典型场景单一产品创建 vs 跨平台UI组件库IO流增强 vs 远程服务代理支付方式选择 vs 订单状态机

六、实际应用建议

  1. 避免过度设计

    • 优先解决实际问题,而非强制使用模式
    • 简单if-else能解决的不要用策略模式
  2. 模式组合使用

    • 工厂方法+原型:高效创建复杂对象
    • 观察者+命令:实现事件驱动的撤销操作
  3. 框架集成

    • Spring:工厂模式(BeanFactory)
    • React:观察者模式(State更新)
    • Node.js:中间件模式(责任链变体)

掌握设计模式的关键在于理解其本质思想,而非机械套用。建议结合具体项目实践,从简单模式(如策略、观察者)开始逐步深入,最终达到"无招胜有招"的设计境界。

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

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

相关文章

AI 推理框架详解,包含如COT、ReAct、LLM+P等的详细说明和分类整理,涵盖其原理、应用场景及对比分析

AI 推理引擎 以下是关于 AI 推理引擎 的详细说明,涵盖其定义、类型、核心组件、技术实现、应用场景及挑战: 1. 推理引擎的定义 推理引擎(Inference Engine)是 AI系统的核心组件,负责根据输入数据、知识库或预训练模…

《探秘鸿蒙分布式软总线:开启无感发现与零等待传输新时代》

在数字化浪潮中,设备之间的互联互通成为构建智能生态的关键。鸿蒙系统中的分布式软总线技术,宛如一座桥梁,让各种智能设备紧密相连。尤其是其实现的设备间无感发现和零等待传输功能,更是为用户带来了前所未有的便捷体验&#xff0…

JDBC 与 MyBatis 详解:从基础到实践

目录 一、JDBC 介绍 二、使用 JDBC 查询用户信息 三、ResultSet 结果集 四、预编译 SQL - SQL 注入问题 五、预编译 SQL - 性能更高 六、JDBC 增删改操作 插入数据: 更新数据: 删除数据: 七、MyBatis 介绍 八、MyBatis 入门程序 引…

基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

<sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等标签的作用和用法

目录 一. sql 代码片段标签 二. resultMap 映射结果集标签 三. where 条件标签 四. set 修改标签 五. trim 标签 六. foreach 循环标签 一. sql 代码片段标签 sql 标签是 mybatis 框架中一个非常常用的标签页,特别是当一张表很有多个字段多,或者要…

《MySQL:MySQL数据库的基本操作》

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 大写表示关键字[]:表示可选项CHARACTER SET ch…

深入简出:KL散度、交叉熵、熵、信息量简介、交叉熵损失

学习这些的最终目的 1、量化两个概率分布的差异 2、推导交叉熵损失 一、KL散度 KL散度就是用来量化两个概论分布的差异,如何量化? 计算真实概论分布P信息量 和 估计概论分布为Q,但实际概率分布为P时信息量的差值 那么设,概率分…

MySQL:Join连接的原理

连接查询的执行过程: 确定第一个需要查询的表【驱动表】 选取代价最小的访问方法去执行单表查询语句 从驱动表每获取到一条记录,都需要到t2表中查找匹配的记录 两表连接查询需要查询一次t1表,两次t2表,在两表的连接查询中&…

【Drools+springboot3规则匹配】

文章目录 一、 业务场景概述二、整体技术架构三、Drools概述1. Drools 简介2. Drools Rete 算法与flink-cep的区别?2.1 Rete 算法概述2.2 Flink CEP 概述四、代码实现4.1 导入依赖4.2 从kafka消费数据4.3 核心类,触发匹配操作并将匹配数据写入mysql4.4 Drools 管理4.5 相关的…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的,几乎维系着整个安卓程序运行的生命周期,但是这么重要的一个东西,我们真的了解它吗?下面跟随着我的脚步,慢慢揭开Hanler的神秘面纱吧! 本文将介绍Handler 的运…

读书笔记 -- MySQL架构

1、MySQL逻辑架构 最上层的服务并不是 MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。 第二层架构是 MySQL 比较有意思的部分。大多数 MySQL 的核心服务功能都在这一层包括查询解析、分析、…

linux 4.14内核jffs2文件系统不自动释放空间的bug

前段时间在做spi-nor flash项目的时候,使用jffs2文件系统,发现在4.14内核下存在无法释放空间的bug,后来进行了修复,修复后功能正常,现将修复patch公开,供后来者学习: diff --git a/fs/jffs2/ac…

vue3+vite 实现.env全局配置

首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖: pnpm install dotenv --save-dev 引入完成后,在vite.config.js配置文件内加入以下内容: const env dotenv.config({ path: ./.env }).parsed define: { // 将…

Oracle 19c部署之手工建库(四)

#Oracle #19c #手工建库 手工创建Oracle数据库(也称为手工建库)是指在已经安装了Oracle数据库软件的基础上,通过手动执行一系列命令和步骤来创建一个新的数据库实例。这种方法与使用Database Configuration Assistant (DBCA)等工具自动创建数…

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷军一度登顶中国首富,太厉害了(2025年03月02日) 早盘,小米港股一路高歌猛进,暴涨4%,股价直接飙到52港元的历史新高。这一波猛如虎的操作,直接把雷军的身家拉到了2980亿元&#xff0c…

【Python爬虫基础篇】--1.基础概念

目录 1.爬虫--定义 2.爬虫--组成 3.爬虫--URL 1.爬虫--定义 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展,万维网成为大量信息的载体…

C语言超详细结构体知识

1.自定义类型:结构体的介绍 在之前的博客中,我们简单介绍过了关于结构体的基本知识,这里我们稍微复习一下。 结构体(struct)是C语言中一种重要的复合数据类型,它允许将不同类型的数据组合成一个整体。 1.1结构体的定义 结构体使…

C++学习:六个月从基础到就业——内存管理:new/delete操作符

C学习:六个月从基础到就业——内存管理:new/delete操作符 本文是我C学习之旅系列的第十七篇技术文章,也是第二阶段"C进阶特性"的第二篇,主要介绍C中动态内存管理的核心操作符——new和delete。查看完整系列目录了解更多…

15~30K,3年以上golang开发经验

继续分享最新的面经,前面发的两篇大家也可以看看: 「坐标上海,20K的面试强度」「北京七猫,薪资25~35K,瞧瞧面试强度」 今天分享的是golang开发岗面经,要求是3年以上golang开发经验,薪资为15~3…