🚪 设计模式入门篇(零基础版)
设计模式是什么 · 为什么学 · 三大分类速记 · 最常用的 5 个模式
1. "设计模式"是什么?别被名字吓到
🏗️ 类比——装修模板:
装修房子:有人总结出"北欧风、简约风、日式风"等成熟模板——不用每次从零发明。
设计模式 = 程序员几十年来总结的代码结构模板——遇到"这种问题"就用"这个套路"。
装修房子:有人总结出"北欧风、简约风、日式风"等成熟模板——不用每次从零发明。
设计模式 = 程序员几十年来总结的代码结构模板——遇到"这种问题"就用"这个套路"。
设计模式:针对"反复出现的代码设计问题"的成熟解决方案。不是代码库,是"套路/思想"。
为什么学:
- 面试必考(单例/工厂/代理是高频)
- 读懂框架源码:Spring 全是模式(IoC=工厂、AOP=代理)——不懂模式读不懂源码
- 写出好维护的代码:别人一看你的结构就知道意图
🎯 记住
- 模式 = 解决特定问题的"套路模板",共 23 种(GoF 经典)
- 不要为了用模式而用模式——先有问题,再套模式
- 你其实已经在用:new 线程池(工厂)、Runtime.getRuntime()(单例)、Comparator(策略)
2. 23 种模式分三类:创建型/结构型/行为型
| 分类 | 解决什么问题 | 代表模式 |
|---|---|---|
| 创建型(5 种) | 对象怎么"造"更好(控制创建过程) | 单例、工厂、建造者 |
| 结构型(7 种) | 类和对象怎么"拼"更好(组合关系) | 代理、装饰器、适配器 |
| 行为型(11 种) | 对象之间怎么"协作"更好(交互方式) | 观察者、策略、模板方法 |
🧩 记忆类比:
创建型 = 怎么生孩子(工厂=代孕公司,单例=独生子)
结构型 = 怎么搭乐高(代理=替身演员,装饰器=给房子加装修)
行为型 = 人与人怎么配合(观察者=订阅公众号,策略=换轮胎方式)
创建型 = 怎么生孩子(工厂=代孕公司,单例=独生子)
结构型 = 怎么搭乐高(代理=替身演员,装饰器=给房子加装修)
行为型 = 人与人怎么配合(观察者=订阅公众号,策略=换轮胎方式)
🎯 面试优先级
- 必背:单例、工厂、代理、观察者、策略、模板方法、装饰器
- 会区分:适配器 vs 外观、代理 vs 装饰器、策略 vs 状态(对比是常考题)
3. 最常用的 5 个模式(先学这 5 个就够用)
- 单例(Singleton):全程序只有一个实例(数据库连接池、配置类)。写法:私有构造 + 静态方法返回唯一实例
- 工厂(Factory):不直接 new,让"工厂"按条件创建(Spring 的 BeanFactory 就是它)
- 代理(Proxy):不直接操作目标,通过"代理人"访问(AOP、远程调用都是它)
- 策略(Strategy):算法可替换——if-else 太多时用"策略类 + Map 注册"替代
- 观察者(Observer):A 变化自动通知 B/C/D(Spring 事件、消息订阅)
单例模式(最常考)
public class ConfigManager {
private static final ConfigManager INSTANCE = new ConfigManager();
private ConfigManager() {} // 构造私有:外面不能 new
public static ConfigManager getInstance() { // 唯一的获取入口
return INSTANCE;
}
}
// 用法:ConfigManager.getInstance() —— 永远拿到同一个对象
// 好处:配置只加载一次、全局共享
🎯 学完这 5 个再看
- 创建型 → creational.html;结构型 → structural.html;行为型 → behavioral.html
- Spring 源码里的模式 → spring-patterns.html(面试加分)
- 对比与场景题 → common-questions.html
4. 设计模式学习建议(别死记)
- 先学"为什么"再学"怎么写":每个模式先看它解决什么问题(痛点),再看代码
- 在源码里找模式:JDK 里就有——Integer.valueOf(工厂)、Collections.unmodifiableList(装饰器)、Comparator(策略)——看到一次胜过背十遍
- 面试答模式公式:问题 → 模式 → 结构 → 好处 → 反例(什么时候不该用)
- 别贪多:先精通 7 个高频的,其他的会"认"就行
🎯 常见误区
- 误区 1:"模式越多越好"——过度设计比不用更糟(简单代码最宝贵)
- 误区 2:"背下 23 个名字就懂设计模式"——面试官问的是"这个场景用什么模式、为什么"
- 误区 3:"模式是 Java 专属"——所有面向对象语言通用(C++/Python 一样)