1. 为什么你必须懂设计模式?
你是否遇到过这样的场景:
- 业务代码越写越长,
if-else嵌套到怀疑人生,想重构却不知从哪下手; - 读 Spring 源码时看到
BeanFactory、Adapter、Decorator,能猜到是"工厂"、"适配器"、"装饰",但说不出核心设计; - 面试时被问到"单例模式的线程安全实现",只能答出
synchronized,对volatile、DCL、枚举防反射只说其然而不知所以然; - 团队 Code Review 时,明明知道这块代码设计有问题,却无法用专业术语清晰表达改进方向......
这一切的根源,都是因为缺少一套可复用的设计语言。
设计模式(Design Patterns)并非凭空创造的理论。1994 年,Erich Gamma 等四人(GoF)从无数大型软件项目中提炼出 23 种经过反复验证的解决方案,出版了《设计模式:可复用面向对象软件的基础》。这些模式是 Spring、Tomcat、MyBatis 等顶级框架的骨架,更是 Java 生态中一切优雅设计的基石。
学习设计模式你将收获:
- 复用性:直接用成熟方案替代临时拼凑,避免重复造轮子;
- 可维护性:清晰的模块划分,代码更好读更好改;
- 可扩展性:天然遵循开闭原则,为未来需求变化预留接口;
- 沟通效率 :一句"这里用策略模式"胜过千言万语;
- 源码阅读能力:读懂框架背后的设计思想,从"会用框架"进阶到"能设计框架"。
2. 本系列与其它设计模式文章有什么不同?
你可能已经在网上看过不少设计模式教程,但大部分停留在"定义 + 简单示例"层面。本系列的核心差异在于:
| 对比维度 | 常见教程 | 本系列 |
|---|---|---|
| 单例写法 | 懒汉式、饿汉式,2~3 种 | 12 种写法 + 反射/序列化/克隆三防 |
| 工厂模式 | 简单工厂一笔带过 | 简单工厂→工厂方法→抽象工厂全链路演进 |
| 框架结合 | 偶尔提一句 | 每篇至少 3 个框架源码案例(Spring/MyBatis/JDK) |
| UML 图 | 手绘或缺失 | 25 张 PlantUML 标准类图,源码可下载 |
| 可运行代码 | 片段代码居多 | 每篇一个 Demo 类,复制即跑 |
| AI 时代视角 | 无 | 每篇分析云原生/AI 场景中的现代应用 |
| 面试导向 | 偶尔 | 每篇末尾误区 + 高频追问 |
| 资源福利 | 无 | 完结后发放全套源码 + UML 源码包 |
💡 这不仅仅是一个教程,更是一份可以反复查阅的 设计模式速查手册。
3. 设计模式的起源与分类
1994 年,Erich Gamma 等四人(GoF)出版了《设计模式:可复用面向对象软件的基础》,收录了 23 种经典模式,按目的分为三大类:
创建型模式(5 种)------ 将对象的创建与使用分离
| 模式 | 核心思路 |
|---|---|
| Singleton | 确保一个类只有一个实例,并提供全局访问点 |
| Factory Method | 定义创建对象的接口,让子类决定实例化哪个类 |
| Abstract Factory | 创建一系列相关或相互依赖的对象,无需指定具体类 |
| Builder | 将复杂对象的构建过程与表示分离 |
| Prototype | 通过拷贝原型创建新对象 |
结构型模式(7 种)------ 组合类或对象形成更大结构
| 模式 | 核心思路 |
|---|---|
| Adapter | 将不兼容的接口转化为客户期望的接口 |
| Bridge | 将抽象与实现分离,使两者可独立变化 |
| Composite | 将对象组合成树形结构,统一处理部分与整体 |
| Decorator | 动态给对象添加额外职责,比继承更灵活 |
| Facade | 为子系统提供统一的高层接口 |
| Flyweight | 共享细粒度对象,减少内存占用 |
| Proxy | 为其他对象提供代理,控制对该对象的访问 |
行为型模式(11 种)------ 关注对象间的职责分配与交互
| 模式 | 核心思路 |
|---|---|
| Chain of Responsibility | 将请求的发送者和接收者解耦,多个对象可处理 |
| Command | 将请求封装为对象,支持参数化、队列化等 |
| Interpreter | 定义语言文法并解释其语句 |
| Iterator | 顺序访问聚合对象而不暴露内部结构 |
| Mediator | 用一个中介对象封装一系列对象的交互 |
| Memento | 捕获并外部化对象内部状态,支持撤销 |
| Observer | 定义一对多依赖,状态变化时自动通知所有依赖者 |
| State | 对象内部状态改变时改变其行为 |
| Strategy | 定义算法族并使其可互相替换 |
| Template Method | 定义算法骨架,将某些步骤延迟到子类 |
| Visitor | 在不改变元素类的前提下定义新操作 |
4. 六大设计原则(SOLID)------ 模式背后的"道"
- 单一职责原则(SRP):一个类只负责一件事。
- 开闭原则(OCP):对扩展开放,对修改关闭。
- 里氏替换原则(LSP):子类必须能替换父类。
- 依赖倒置原则(DIP):依赖抽象而非具体实现。
- 接口隔离原则(ISP):接口应小而专一。
- 迪米特法则(LoD):一个对象应尽量少了解其他对象。
📌 想了解设计模式中六大设计原则在实际项目中是如何应用的,可阅读 抖音抖店电子面单对接:从"面条代码"到整洁架构的涅槃之路 文章获取详情。 后续每篇模式文章中,我都会标注它体现了哪些原则,帮你打通"道"与"术"。
5. 2026 年了,设计模式过时了吗?
你可能会问:现在 AI 都能写代码了,云原生、微服务满天飞,23 种"老古董"模式还有必要学吗?
答案是:不仅有必要,而且比以往更重要。
5.1 面试的"硬通货"从未贬值
2026 年各大厂的 Java 面试题库中,设计模式依然占据独立且重要的章节。变化在于------面试官不再满足于"单例有几种写法",而是追问:
- "Spring 中哪里用了代理模式?为什么不用装饰器模式?"
- "你项目中的责任链模式和策略模式是如何配合的?"
- "如何用函数式接口简化策略模式的实现?"
背定义就能过关的时代结束了,真正理解模式的设计意图和适用边界,才是通关密码。
5.2 框架的"灵魂"从未改变
Spring Boot 3.x、Spring Cloud、MyBatis、Netty 等主流框架本身就是设计模式的集大成者。不懂代理模式,你永远看不懂 Spring AOP 的源码;不懂模板方法模式,你永远不知道 JdbcTemplate 为什么能自动管理连接和资源释放。
设计模式是你从"API 调用侠"跃升到"框架阅读者"的唯一阶梯。
5.3 AI 时代的"编程素养"反而更重要
大语言模型确实能生成代码,但代码质量高度依赖你的 Prompt 质量。当你对 AI 说"用策略模式重构这段 if-else 逻辑,要求符合开闭原则"时,你不仅能得到更准确的代码,还能快速验证和迭代设计方案。
设计模式正在成为人机协作编程的"通用指令集"------你越懂模式,AI 就越听话。
5.4 云原生时代的"新经典"与 GoF 一脉相承
云原生催生了一批新模式------Saga、CQRS、Event Sourcing、Circuit Breaker...... 但这些"新经典"并非凭空诞生:
- Saga 脱胎于状态模式 + 责任链模式;
- CQRS 蕴含着策略模式的核心思想;
- Event Sourcing 是观察者模式 + 备忘录模式的分布式延伸。
学透 GoF 23 种经典模式,你就能看懂所有新模式的"基因图谱"。
6. 设计模式面试高频题 Top10(速记福利)
作为开篇福利,这里列出面试中最常被问到的 10 个设计模式问题。后续每篇文章会展开详解:
| 序号 | 问题 | 对应模式 |
|---|---|---|
| 1 | 单例有几种写法?DCL 为什么要加 volatile? | Singleton |
| 2 | 简单工厂和工厂方法有什么区别? | Factory |
| 3 | 抽象工厂和工厂方法分别适用于什么场景? | Abstract Factory |
| 4 | 代理模式和装饰器模式的核心区别? | Proxy / Decorator |
| 5 | 策略模式和状态模式的区别? | Strategy / State |
| 6 | Spring AOP 用了什么设计模式? | Proxy |
| 7 | Servlet Filter 是什么设计模式? | Chain of Responsibility |
| 8 | JDK 中哪些地方用了设计模式? | 综合 |
| 9 | 模板方法模式和策略模式如何选择? | Template Method / Strategy |
| 10 | 观察者模式和发布-订阅模式的区别? | Observer |
7. 《Java 23 种设计模式:从踩坑到精通》总目录(持续更新)
| 序号 | 文章标题 | 类别 | 备注 |
|---|---|---|---|
| 1 | Java 23 种设计模式:从踩坑到精通------ 开篇及系列介绍(本文) | 综述 | 永久导航页 |
| 2 | Java 23 种设计模式:从踩坑到精通 ------ 单例模式 ------ 你写的真的安全吗?(12种写法全揭秘) | 创建型 | 12种写法+三防 |
| 3 | Java 23 种设计模式:从踩坑到精通 ------ 工厂模式 ------ 还在写一坨 if-else?简单工厂→工厂方法→抽象工厂全演进 | 创建型 | 📦 工厂体系合集(上) |
| 4 | Java 23 种设计模式:从踩坑到精通 ------ 抽象工厂 ------ 支付/收款如何成套创建?跨平台 UI 如何一键换肤? | 创建型 | 📦 工厂体系合集(下) |
| 5 | Java 23 种设计模式:从踩坑到精通 ------ 建造者模式 ------ 构造器参数太多?试试链式调用 | 创建型 | |
| 6 | Java 23 种设计模式:从踩坑到精通 ------ 原型模型 ------ 克隆对象,深拷贝与浅拷贝的坑你踩过吗? | 创建型 | |
| 7 | Java 23 种设计模式:从踩坑到精通 ------ Adapter ------ 让不兼容的接口也能一起工作 | 结构型 | |
| 8 | Java 23 种设计模式:从踩坑到精通 ------ Bridge ------ 抽象与实现分离,应对多维度变化 | 结构型 | |
| 9 | Java 23 种设计模式:从踩坑到精通 ------ Composite ------ 树形结构处理,部分与整体一视同仁 | 结构型 | |
| 10 | Java 23 种设计模式:从踩坑到精通 ------ Decorator ------ 比继承更灵活的扩展方式,你用过吗? | 结构型 | 🔗 对比:代理模式(第13篇) |
| 11 | Java 23 种设计模式:从踩坑到精通 ------ Facade ------ 给复杂系统装一个"一键启动" | 结构型 | |
| 12 | Java 23 种设计模式:从踩坑到精通 ------ Flyweight ------ 内存吃不消?试试共享对象池 | 结构型 | |
| 13 | Java 23 种设计模式:从踩坑到精通 ------ Proxy ------ 你的 AOP 就是用代理实现的 | 结构型 | 🔗 对比:装饰器模式(第10篇) |
| 14 | Java 23 种设计模式:从踩坑到精通 ------ Chain of Responsibility ------ 请求流转,审批流程的本质 | 行为型 | |
| 15 | Java 23 种设计模式:从踩坑到精通 ------ Command ------ 把操作封装成对象,实现撤销与排队 | 行为型 | |
| 16 | Java 23 种设计模式:从踩坑到精通 ------ Interpreter ------ 自己动手写一个小语言解释器 | 行为型 | |
| 17 | Java 23 种设计模式:从踩坑到精通 ------ Iterator ------ 遍历集合,为什么不直接暴露内部结构? | 行为型 | |
| 18 | Java 23 种设计模式:从踩坑到精通 ------ Mediator ------ 对象关系太乱?请一位"中间人" | 行为型 | |
| 19 | Java 23 种设计模式:从踩坑到精通 ------ Memento ------ 快照与撤销,给对象装一个"后悔药" | 行为型 | |
| 20 | Java 23 种设计模式:从踩坑到精通 ------ Observer ------ 发布-订阅,你每天都在用的模式 | 行为型 | |
| 21 | Java 23 种设计模式:从踩坑到精通 ------ State ------ if-else 满天飞?让状态自己决定行为 | 行为型 | 🔗 对比:策略模式(第22篇) |
| 22 | Java 23 种设计模式:从踩坑到精通 ------ Strategy ------ 算法族的封装与切换,告别 if-else | 行为型 | 🔗 对比:状态模式(第21篇) |
| 23 | Java 23 种设计模式:从踩坑到精通 ------ Template Method ------ 定义算法骨架,交给子类填充细节 | 行为型 | |
| 24 | Java 23 种设计模式:从踩坑到精通 ------ Visitor ------ 数据结构稳定但操作多变?试试访问者 | 行为型 | |
| 25 | Java 23 种设计模式:从踩坑到精通 ------ 系列总结:24 篇文章,我们学到了什么? | 总结 | 附全套源码+UML福利 |
📌 追更指南:建议收藏本文作为导航页,每更新一篇我会在目录中补上链接。点击右上角「关注」,每周更新 2~3 篇,预计 2 个月完结,不错过任何一篇。
8. 场景速查索引(遇到问题→直接找模式)
| 你的问题 | 用什么模式 | 对应文章 |
|---|---|---|
| 全局只有一个实例,多了浪费 | 单例模式 | 第 2 篇 |
| 一坨 if-else 创建对象 | 工厂方法 | 第 3 篇 |
| 支付+收款必须成套创建 | 抽象工厂 | 第 4 篇 |
| 构造器参数太多 | 建造者模式 | 第 5 篇 |
| 复制对象,修改不污染原对象 | 原型模式 | 第 6 篇 |
| 对接第三方接口,格式不兼容 | 适配器模式 | 第 7 篇 |
| 多维度变化导致类爆炸 | 桥接模式 | 第 8 篇 |
| 树形结构(菜单/文件夹/组织架构) | 组合模式 | 第 9 篇 |
| 动态增强功能,不想用继承 | 装饰器模式 | 第 10 篇 |
| 复杂子系统调用太繁琐 | 外观模式 | 第 11 篇 |
| 大量重复对象,内存溢出 | 享元模式 | 第 12 篇 |
| AOP、事务、权限控制 | 代理模式 | 第 13 篇 |
| 多级审批,流程传递 | 责任链模式 | 第 14 篇 |
| 撤销操作、宏命令 | 命令模式 | 第 15 篇 |
| 自定义公式/规则解析 | 解释器模式 | 第 16 篇 |
| 自定义集合遍历 | 迭代器模式 | 第 17 篇 |
| 多对象复杂交互,网状耦合 | 中介者模式 | 第 18 篇 |
| 快照、撤销、后悔药 | 备忘录模式 | 第 19 篇 |
| 状态变化自动通知 | 观察者模式 | 第 20 篇 |
| 订单状态流转,行为随状态变 | 状态模式 | 第 21 篇 |
| 多种算法/规则动态切换 | 策略模式 | 第 22 篇 |
| 流程固定,部分步骤可定制 | 模板方法模式 | 第 23 篇 |
| 数据结构稳定,操作多变 | 访问者模式 | 第 24 篇 |
💡 这张表让专栏从"学习资料"升级为"开发手册",建议收藏备用。
9. 易混模式速查表
| 模式 A | 模式 B | 核心区别 | 对应文章 |
|---|---|---|---|
| 代理模式 | 装饰器模式 | 代理控制访问,装饰增强功能 | 第10篇 vs 第13篇 |
| 策略模式 | 状态模式 | 策略由客户端选择,状态自己决定切换 | 第21篇 vs 第22篇 |
| 适配器模式 | 装饰器模式 | 适配改变接口,装饰不改变接口 | 第7篇 vs 第10篇 |
| 外观模式 | 中介者模式 | 外观单向简化,中介者双向协调 | 第11篇 vs 第18篇 |
| 工厂方法 | 抽象工厂 | 单一产品扩展 vs 产品族创建 | 第3篇 vs 第4篇 |
| 享元模式 | 单例模式 | 享元可多个共享实例,单例只有一个 | 第12篇 vs 第2篇 |
| 策略模式 | 模板方法 | 策略用组合替换算法,模板用继承控制骨架 | 第22篇 vs 第23篇 |
10. 推荐阅读路线
🗺️ 入门必读(6篇)
单例 → 工厂方法 → 建造者 → 适配器 → 外观 → 模板方法
🗺️ 进阶提升(10篇)
抽象工厂 → 装饰器 → 代理 → 观察者 → 策略 → 状态 → 责任链 → 命令 → 组合 → 迭代器
🗺️ 高阶挑战(7篇)
原型 → 桥接 → 享元 → 中介者 → 备忘录 → 解释器 → 访问者
11. 如何高效学习本系列?
- 带着问题读:每篇都以真实场景痛点开头,先思考再对照模式。
- 动手运行代码:所有示例均可直接运行,推荐亲自 Debug 一遍。
- 对比记忆:每篇末尾有对比表格和面试题,辅助自测。
- 结合框架:关注 Spring、MyBatis 等源码中的模式应用,让理论落地。