一、设计模式整体概述
GoF(Gang of Four,四人帮) :指1994年联合出版《设计模式:可复用面向对象软件的基础》的四位计算机领域权威专家,四位作者及中文名分别为:Erich Gamma(埃里希·伽马)、Richard Helm(理查德·赫尔姆)、Ralph Johnson(拉尔夫·约翰逊)、John Vlissides(约翰·弗利赛德斯)。四人共同总结并定义了 23种经典面向对象设计模式,是全球软件开发通用的设计规范标准,该套设计思想适用于所有编程语言,并非Java独有。
三大核心分类:
-
创建型模式(5种) :解决 对象创建 问题,管控对象实例化过程
-
结构型模式(7种) :解决 类/对象组合结构 问题,灵活组装对象、扩展功能
-
行为型模式(11种) :解决 对象之间交互、职责分配、流程调度 问题
二、创建型设计模式(5种)
核心目的:统一、规范、灵活地创建对象,隔离对象创建与使用,降低耦合。
1. 单例模式(Singleton)
核心作用 :保证一个类全局只有一个实例,提供全局访问入口。
适用场景:工具类、配置类、线程池、缓存对象、日志对象。
常见实现:饿汉式、懒汉式、双重检查锁DCL、静态内部类、枚举(最优)。
代码示例(枚举最优)
java
// 枚举单例:线程安全、防止反射破坏、防止序列化破坏
public enum Singleton {
INSTANCE;
public void doSomething(){
System.out.println("执行业务逻辑");
}
}
// 使用:Singleton.INSTANCE.doSomething();
JDK源码出处:Runtime.getRuntime()、Spring容器Bean默认单例
2. 工厂方法模式(Factory Method)
核心作用 :定义工厂抽象接口,由子类决定实例化哪个类,单一产品等级。
适用场景:同一类产品、不同具体实现,需要灵活扩展产品。
代码示例
java
// 产品接口
interface Phone{void call();}
// 具体产品
class IPhone implements Phone{@Override public void call(){System.out.println("苹果打电话");}}
class Huawei implements Phone{@Override public void call(){System.out.println("华为打电话");}}
// 工厂抽象
interface PhoneFactory{Phone createPhone();}
// 具体工厂
class IPhoneFactory implements PhoneFactory{@Override public Phone createPhone(){return new IPhone();}}
class HuaweiFactory implements PhoneFactory{@Override public Phone createPhone(){return new Huawei();}}
JDK源码出处:java.util.Calendar、线程池ThreadPoolExecutor
3. 抽象工厂模式(Abstract Factory)
核心作用 :工厂方法升级,支持产品族、多系列产品统一创建。
适用场景:多组关联产品、成套创建场景(如操作系统按钮/弹窗组件)。
核心特点:工厂方法是「单个产品」,抽象工厂是「产品族(成套产品)」
JDK源码出处:javax.xml.parsers 解析器工厂体系
4. 建造者模式(Builder)
核心作用 :分步构建复杂对象,参数灵活组合,适配多参数、参数可选场景。
适用场景:实体类参数多、参数可选、链式赋值(如Lombok @Builder)。
代码示例(经典链式Builder)
java
public class User {
private String name;
private Integer age;
private String email;
// 私有构造
private User(Builder builder){
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
}
public static Builder builder(){return new Builder();}
public static class Builder{
private String name;
private Integer age;
private String email;
public Builder name(String name){this.name = name;return this;}
public Builder age(Integer age){this.age = age;return this;}
public Builder email(String email){this.email = email;return this;}
public User build(){return new User(this);}
}
}
// 使用:User user = User.builder().name("张三").age(18).build();
JDK源码出处:StringBuilder、Spring BeanDefinitionBuilder
5. 原型模式(Prototype)
核心作用 :通过对象克隆创建新对象,无需重新new,节省创建开销。
适用场景:对象创建成本高、大量相似对象、配置对象复制。
代码示例
java
class Person implements Cloneable{
public String name;
@Override
public Person clone() throws CloneNotSupportedException {
return (Person)super.clone();
}
}
// 使用:克隆生成新对象,不通过new
Person p1 = new Person();
Person p2 = p1.clone();
JDK源码出处:ArrayList.clone()、Object.clone()
三、结构型设计模式(7种)
核心目的:通过类继承、对象组合,灵活搭建系统结构,扩展功能、兼容适配。
1. 适配器模式(Adapter)
核心作用 :接口转换、兼容适配,让不兼容的接口可以协同工作。
适用场景:新旧系统兼容、第三方接口适配、接口改造兼容老代码。
代码示例
java
// 新接口
interface NewSocket{void charge();}
// 老设备
class OldDevice{public void oldCharge(){System.out.println("老式充电");}}
// 适配器
class DeviceAdapter extends OldDevice implements NewSocket{
@Override
public void charge() {
super.oldCharge();
}
}
JDK源码出处:InputStreamReader、OutputStreamWriter
2. 装饰器模式(Decorator)
核心作用 :动态给对象扩展功能,不修改原类代码,多层包装。
适用场景:IO流包装、权限增强、功能叠加扩展(JDK IO经典实现)。
核心区别 :装饰器同接口、多层增强 ;适配器接口转换
JDK源码出处:BufferedReader、BufferedInputStream
3. 代理模式(Proxy)
核心作用 :通过代理对象控制原对象访问,增强前后逻辑。
分类:静态代理、JDK动态代理、CGLIB代理。
适用场景:Spring AOP、事务控制、日志记录、权限校验、延时加载。
静态代理示例
java
interface UserService{void login();}
class UserServiceImpl implements UserService{@Override public void login(){System.out.println("登录业务");}}
// 代理类
class UserProxy implements UserService{
private UserService target;
public UserProxy(UserService target){this.target=target;}
@Override
public void login() {
System.out.println("日志前置");
target.login();
System.out.println("日志后置");
}
}
JDK源码出处:JDK动态代理Proxy、Spring AOP
4. 外观模式(Facade)
核心作用 :提供统一入口,隐藏复杂子系统细节,简化调用。
适用场景:复杂模块封装、统一接口、系统分层入口。
代码示例:对外提供一个统一入口,隐藏多个子模块
JDK源码出处:java.lang.Runtime、SpringApplicationContext
5. 桥接模式(Bridge)
核心作用 :分离抽象与实现,让两者独立扩展,解决多维度类爆炸问题。
适用场景:多维度变化场景(品牌+设备、颜色+形状等)。
核心作用:解决「多维度继承导致的类爆炸」
JDK源码出处:AWT、Swing 多维度组件设计
6. 组合模式(Composite)
核心作用 :统一处理单个对象与组合对象,树形结构统一操作。
适用场景:菜单树、部门组织树、文件目录结构。
核心特点 :叶子节点和容器节点统一操作
JDK源码出处:XML DOM树、文件File结构
7. 享元模式(Flyweight)
核心作用 :对象池复用,共享细粒度对象,减少内存占用。
适用场景:线程池、字符串常量池、Integer缓存、连接池。
核心思想:内部不变(享元)、外部可变(外部状态)
JDK源码出处:IntegerCache、String常量池、ThreadPoolExecutor
四、行为型设计模式(11种)
核心目的:规范对象间通信、职责分配、流程控制、算法替换。
1. 策略模式(Strategy)
核心作用 :定义一系列算法,算法可自由替换,消除大量if-else。
适用场景:支付方式、折扣算法、排序策略、业务分支判断。
代码示例(消灭if-else)
java
// 策略接口
interface PayStrategy{void pay();}
// 具体策略
class AliPay implements PayStrategy{@Override public void pay(){System.out.println("支付宝支付");}}
class WechatPay implements PayStrategy{@Override public void pay(){System.out.println("微信支付");}}
// 上下文调度
class PayContext{
private PayStrategy strategy;
public PayContext(PayStrategy strategy){this.strategy=strategy;}
public void executePay(){strategy.pay();}
}
JDK源码出处:Comparator、ThreadPoolExecutor拒绝策略
2. 模板方法模式(Template Method)
核心作用 :父类定义固定流程骨架,子类实现可变步骤。
适用场景:统一业务流程、框架固定执行流程(Spring源码大量使用)。
代码示例
java
abstract class AbstractTask{
// 固定模板流程
public final void execute(){
before();
doTask();
after();
}
protected void before(){System.out.println("前置通用操作");}
protected abstract void doTask();
protected void after(){System.out.println("后置通用操作");}
}
// 子类只实现可变逻辑
class MyTask extends AbstractTask{
@Override
protected void doTask() {
System.out.println("执行具体任务");
}
}
JDK源码出处:Spring Framework 大量模板方法、HttpServlet
3. 观察者模式(Observer)
核心作用 :发布-订阅机制,一对多消息通知,解耦发布者与订阅者。
适用场景:事件监听、消息推送、Spring事件机制、MQ消息消费。
核心特点:一对多、发布者与订阅者完全解耦
JDK源码出处:java.util.Observer、Spring ApplicationEvent
4. 迭代器模式(Iterator)
核心作用 :提供统一遍历接口,隐藏集合内部结构。
适用场景:Java集合Iterator迭代器、统一遍历各类容器。
核心作用:统一遍历方式,屏蔽数组、链表、哈希表差异
JDK源码出处:java.util.Iterator、ListIterator
5. 责任链模式(Chain of Responsibility)
核心作用 :多个处理器链式逐级处理请求,请求可传递、可终止。
适用场景:拦截器、过滤器、权限校验、审批流程、Spring拦截器链。
代码示例
java
// 处理器抽象
interface Handler{void handle(String request);}
// 具体处理器
class AuthHandler implements Handler{@Override public void handle(String req){System.out.println("权限校验");}}
class LogHandler implements Handler{@Override public void handle(String req){System.out.println("日志记录");}}
// 链式传递:可自由拼接、可中断
JDK源码出处:Servlet Filter、Spring Interceptor链
6. 命令模式(Command)
核心作用 :将请求封装为对象,支持撤销、排队、日志、重试。
适用场景:任务队列、操作撤销、定时任务、指令调度。
核心价值:把「动作」变成「对象」,可存储、可排队、可撤销
JDK源码出处:Runnable、ThreadPoolExecutor任务提交
7. 状态模式(State)
核心作用 :根据对象状态自动切换行为,消除大量状态判断if-else。
适用场景:订单状态、审批状态、游戏状态流转。
优势:彻底消除 if(状态1)、if(状态2) 烂代码
JDK源码出处:线程State状态机、Spring状态机
8. 备忘录模式(Memento)
核心作用 :保存对象历史状态,支持状态回滚、撤销操作。
适用场景:文档撤销、版本回退、快照备份。
核心思想:单独保存快照,不破坏原对象
9. 访问者模式(Visitor)
核心作用 :分离数据结构与数据操作,不修改实体类即可新增操作。
适用场景:数据统计、报表生成、固定结构多变操作场景。
特点 :极少用、面试冷门、适合数据结构固定、操作频繁新增
10. 中介者模式(Mediator)
核心作用 :通过中介统一通信,解除多对象耦合,避免多对多依赖。
适用场景:聊天室、消息中转、多模块交互调度。
解决痛点:多对象互相依赖,网状耦合爆炸
11. 解释器模式(Interpreter)
核心作用 :定义语法规则,用于解析自定义表达式、语法。
适用场景:规则引擎、表达式解析、编译器语法解析(极少业务使用)。
特点:学习成本高、业务几乎不用,仅框架底层使用
五、23种设计模式终极汇总表
| 分类 | 包含模式 | 核心一句话作用 |
|---|---|---|
| 创建型5种 | 单例、工厂方法、抽象工厂、建造者、原型 | 管控对象创建,解耦创建与使用 |
| 结构型7种 | 适配器、装饰器、代理、外观、桥接、组合、享元 | 组装、扩展、适配系统结构,优化架构 |
| 行为型11种 | 策略、模板、观察者、迭代器、责任链、命令、状态、备忘录、访问者、中介者、解释器 | 规范对象交互、算法、流程、状态调度 |
六、面试高频重点模式(必背)
面试90%会问的核心模式:
-
单例模式:手写、线程安全、枚举优缺点
-
工厂模式:普通工厂、抽象工厂区别
-
建造者模式:实际开发应用场景
-
代理模式:动态代理、AOP原理
-
策略模式:消灭if-else实战
-
模板方法模式:框架源码高频
-
观察者模式:事件驱动原理
-
责任链模式:拦截器、过滤器原理
七、全文总结
-
Java 经典设计模式共 23种,分为创建型(5)、结构型(7)、行为型(11)。
-
创建型 关注「对象怎么创建」,结构型 关注「代码怎么组装」,行为型关注「对象怎么交互执行」。
-
实际开发不用死记所有模式,重点掌握8大高频模式,可解决90%代码解耦、优化、架构设计问题。