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),外观(封装子系统)

相关推荐
lzp079116 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
Memory_荒年17 小时前
TiDB:当 MySQL 遇上分布式,生了个“超级混血儿”
java·数据库·后端
asom2217 小时前
DDD(领域驱动设计) 核心概念详解
java·开发语言·数据库·spring boot
大傻^18 小时前
LangChain4j Spring Boot Starter:自动配置与声明式 Bean 管理
java·人工智能·spring boot·spring·langchain4j
沐硕18 小时前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
愣头不青18 小时前
560.和为k的子数组
java·数据结构
共享家952718 小时前
Java入门(String类)
java·开发语言
l软件定制开发工作室18 小时前
Spring开发系列教程(34)——打包Spring Boot应用
java·spring boot·后端·spring·springboot
0xDevNull18 小时前
Spring Boot 循环依赖解决方案完全指南
java·开发语言·spring
爱丽_18 小时前
GC 怎么判定“该回收谁”:GC Roots、可达性分析、四种引用与回收算法
java·jvm·算法