GoF23种设计模式 简介

GoF23种设计模式

GoF23种设计模式(GoF指Gang of Four,四人组,《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者),按照核心功能和应用场景可分为三大类:创建型模式、结构型模式和行为型模式。

一、创建型模式

核心意图:封装对象创建过程,解耦"创建"与"使用",提高代码灵活性。

模式名称 核心功能 典型应用场景
简单工厂模式 (Simple Factory) 一个 工厂类根据参数 创建不同产品(非GoF标准) 工具类创建
1.工厂方法模式(Factory Method) 抽象工厂接口,子类决定实例化哪个产品 日志框架、数据库驱动
2.抽象工厂模式(Abstract Factory)) 创建一系列相关/依赖的产品族 跨平台UI库、Spring的BeanFactory
3.建造者模式(Builder) 分步构建复杂对象、分离构建与表示 复杂对象创建(如StringBuilder)
4.原型模式(Prototype) 通过复制现有实例创建新对象(避免重复初始化) 大对象复用(如缓存对象克隆
5.单例模式(Singleton) 确保一个类只有一个实例,提供全局访问点 配置管理器、线程池、数据库连接池
二、结构型模式

核心意图:处理类\对象的组合关系,优化代码结构,提高扩展性和复用性。

模式名称 核心功能 典型应用场景
6.适配器模式(Adapter) 转换一个类的接口为客户端期望的接口(兼容旧系统) 第三方库适配 、接口版本兼容(如Java的InputStreamReader)
7.桥接模式 (bridge) 分离抽象与实现,使二者可独立扩展 多维度产品扩展(如手机品牌+操作系统)
8.组合模式(Composite) 树形结构中统一处理单个对象和组合对象 文件夹/文件结构、UI组件树(如Swing组件)
9.装饰器模式(decorator) 动态给对象添加额外功能(不改变原类结构) IO流包装(如BufferReader)、Spring AOP增强
10.外观模式(Facade) 为复杂子系统提供统一的简化接口 框架入口(如Spring的ApplicationContest),API网关
11.享元模式(Flyweight) 共享细粒度对象、减少内存消耗 常量池(String常量池)、缓存池(如数据库连接池)
12.代理模式 (Proxy) 为对象提供代理,控制访问(如权限、缓存) 远程代理(RPC),Spring AOP代理、缓存代理
三、行为型模式

核心意图:描述类或对象之间的交互行为(通信、职责分配),优化代码协作逻辑 。

模式名称 核心功能 典型应用场景
13.责任链模式(Chain of Responsibility) 多个对象链式处理请求,直到有对象处理 请求审批流程、日志级别处理
14.命令模式(Conmmand) 将请求封装为对象,支持参数化,队列化执行 命令队列、撤销/重做功能
15.解释器模式(Interpreter) 定义语言语法规则,解析特定格式的表达式 表达式解析
16.迭代器模式(Iterator) 提供统一 遍历集合的接口,隐藏集合内部结构 Java集合的Iterator接口,foreach循环
17.中介者模式(Mediator) 封装对象间的复杂交互,通过中介者统一协调 聊天室、GUI组件通信
18.备忘录模式(Memento) 保存对象状态,以便后续恢复(不暴露内部结构) 撤销功能(如文本编辑器的 历史记录)、序列化备份
19.观察者模式(Observer) 一对多依赖,一个对象变化时通知所有依赖对象 事件监听,消息订阅
20.状态模式(State) 对象状态变化时,动态改变其行为(状态封装) 订单状态流转、线程状态管理
21.策略模式(Strategy) 定义多个算法,动态选择使用(替换if/else) 排序算法选择,支付方式切换,日志输出策略
22.模板方法模式(Template Method) 父类定义算法骨架,子类实现具体步骤 框架模板、回调函数
23.访问者模式(Visitor) 分离对象数据结构与操作,动态扩展新操作 数据结构遍历+多操作(如XML/JSON解析,报表生成)
  • 高频使用模式

    • 创建型:单例、工厂方法 、抽象工厂、建造者

    • 结构型:适配器、装饰器、代理、外观

    • 行为型:观察者、策略、模板方法、责任链

  • 场景选择举例

    • 需灵活创建对象:工厂方法、抽象工厂

    • 需扩展对象功能:装饰器/代理/适配器

    • 需优化对象交互:观察者/中介者/责任链

    • 需简化 复杂逻辑:策略(替换if/else),外观(封装子系统)

相关推荐
QianhangQianping9 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent15 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101116 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101117 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
开源推荐官21 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.22 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
从琳开始9891 小时前
从Socket到UDP回显服务器:Java网络编程完整指南
java·网络·网络协议·udp·java-ee
西瓜拿铁好喝2 小时前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
学长毕设2 小时前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
明天也要努力学习2 小时前
深入理解 JVM 垃圾回收(GC)
java·jvm