简述23种设计模式
本文最后更新于 2025-10-16,文章内容可能已经过时。
一、设计模式分类
设计模式分为三大类,共 23种
- 创建型模式(5种)
主要解决对象的创建问题,封装复杂的创建过程 - 结构型模式(7种)
主要解决类或对象的组合方式,优化系统结构 - 行为型模式(11种)
主要解决对象之间的交互和职责分配问题
| 模式类型 | 核心思想 | 典型应用场景 |
|---|---|---|
| 创建型模式 | 封装对象创建逻辑 | 支付系统、GUI组件、配置管理 |
| 结构型模式 | 组合类或对象结构 | 接口适配、权限控制、延迟加载 |
| 行为型模式 | 对象间交互与职责分配 | 事件驱动、策略切换、状态管理 |
二、具体设计模式
1. 创建型模式
| 模式名称 | 目的 | 适用场景 |
|---|---|---|
| 单例模式 | 确保一个类只有一个实例,并提供全局访问点 | 需要全局唯一实例的场景(如数据库连接池、配置管理) |
| 工厂模式 | 将对象的创建逻辑与使用逻辑分离,封装复杂创建过程 | 对象创建逻辑复杂,或需要动态决定创建哪种类型的对象 |
| 抽象工厂模式 | 提供一个创建一系列相关或依赖对象的接口,无需指定具体类 | 需要创建一组相关对象的场景(如跨平台主题库) |
| 建造者模式 | 分步骤构建复杂对象,允许逐步配置对象属性 | 对象创建步骤复杂,且需要灵活定制不同配置的场景(如游戏角色创建) |
| 原型模式 | 通过复制现有实例创建新对象,避免直接实例化 | 对象创建成本高,且已有实例可作为模板时(如克隆对象) |
2. 结构型模式
| 模式名称 | 目的 | 适用场景 |
|---|---|---|
| 适配器模式 | 将不兼容的接口转换为兼容的接口,使原本无法协作的类能够协作 | 集成旧系统或第三方库时,接口不匹配的场景 |
| 装饰者模式 | 动态地为对象添加功能,避免继承导致的类爆炸 | 需要为对象添加额外功能,且功能可能组合变化的场景(如咖啡加料) |
| 代理模式 | 控制对对象的访问,提供额外操作(如权限验证、延迟加载) | 需要控制对象访问或增强功能的场景(如远程调用、缓存代理) |
| 外观模式 | 为复杂子系统提供统一接口,简化调用 | 需要简化接口或隐藏子系统复杂度的场景(如家电遥控器) |
| 组合模式 | 将对象组合成树形结构,统一处理单个对象和组合对象 | 需要处理部分-整体层次结构的场景(如文件系统目录) |
| 桥接模式 | 将抽象部分与实现部分分离,使它们可以独立变化 | 抽象和实现需要独立扩展的场景(如图形接口与具体绘图引擎) |
| 享元模式 | 通过共享对象减少内存占用,提高性能 | 需要大量相似对象且创建开销大的场景(如文本编辑器中的字符对象) |
3. 行为型模式
| 模式名称 | 目的 | 适用场景 |
|---|---|---|
| 策略模式 | 定义一系列算法,使它们可以互换,独立于使用它们的客户端 | 需要在运行时动态选择算法或策略的场景(如支付方式选择) |
| 观察者模式 | 建立一对多的依赖关系,当对象状态变化时通知所有依赖者 | 需要实现事件驱动或发布-订阅机制的场景(如消息推送、GUI事件处理) |
| 责任链模式 | 将请求的发送者和接收者解耦,多个对象依次处理请求 | 需要处理请求链的场景(如审批流程、异常处理) |
| 命令模式 | 将请求封装为对象,支持操作的排队、日志记录和撤销 | 需要将操作封装为对象的场景(如事务管理、宏命令) |
| 状态模式 | 允许对象在其内部状态改变时改变行为 | 对象行为依赖于状态且状态频繁变化的场景(如订单状态流转) |
| 模板方法模式 | 定义算法骨架,将某些步骤延迟到子类实现 | 需要复用算法框架但允许子类自定义部分步骤的场景(如测试框架) |
| 访问者模式 | 在不修改元素类的前提下,为对象结构中的元素添加新操作 | 需要对对象结构中的元素执行多种操作且操作逻辑复杂时(如编译器语法树遍历) |
| 中介者模式 | 通过中介者对象集中处理对象间的交互,降低耦合 | 对象间交互复杂且需要解耦的场景(如聊天室消息转发) |
| 迭代器模式 | 提供一种顺序访问集合元素的方式,而不暴露其内部表示 | 需要遍历集合对象且不想暴露其内部结构的场景(如数据库查询结果集) |
| 备忘录模式 | 保存对象的状态并在需要时恢复,且不破坏封装性 | 需要实现撤销操作或状态快照的场景(如游戏存档) |
| 解释器模式 | 定义语言的文法,并提供解释器来解析语言中的句子 | 需要实现特定领域语言或规则解析的场景(如正则表达式解析) |
根据目的和用途不同,设计模式可分为创建型模式、结构型模式和行为型模式三种。
根据处理范围不同,设计模式可分为类模式和对象模式。类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,属于静态关系。对象模式处理对象之间的关系,这些关系在运行时刻变化,更具动态性。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 软件从业者Hort
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

