设计模式:后端开发必备设计思想
在后端开发、架构设计与代码重构中,设计模式 是解决特定场景下重复问题的可复用解决方案,是工程师从「会写代码」到「写好代码」的核心进阶技能。本文将系统梳理设计模式的分类、核心原则、23 种经典模式详解及实战选型,帮你构建完整的设计模式知识体系。
一、设计模式基础认知
1. 什么是设计模式
设计模式是前人总结的、经过验证的软件设计最佳实践 ,不是可直接调用的代码库,而是一套解决特定问题的思路与模板 。它关注类与对象的组织关系 ,目标是提升代码的可复用性、可扩展性、可维护性,降低耦合度。
2. 设计模式的四大作用
- 解耦:分离模块依赖,避免牵一发而动全身
- 复用:通用方案无需重复造轮子,减少冗余代码
- 扩展:新增功能时无需修改原有代码,符合开闭原则
- 可读:统一的设计范式,降低团队协作的沟通成本
3. 设计模式的七大设计原则
设计模式是原则的落地实践,先掌握原则再理解模式,事半功倍:
- 单一职责原则:一个类 / 方法只负责一项功能
- 开闭原则:对扩展开放,对修改关闭(核心原则)
- 里氏替换原则:子类可替换父类,不破坏原有逻辑
- 接口隔离原则:接口粒度细化,避免实现不需要的方法
- 依赖倒置原则:依赖抽象而非具体实现
- 迪米特法则(最少知道原则) :一个对象只与直接朋友通信
- 合成复用原则:优先使用组合 / 聚合,而非继承
二、23 种经典设计模式分类
GoF(四人组)提出的 23 种设计模式,按用途分为三大类,覆盖软件设计的全场景:
| 分类 | 核心目标 | 包含模式 |
|---|---|---|
| 创建型模式 | 关注对象的创建过程,解耦创建与使用 | 单例、工厂方法、抽象工厂、建造者、原型 |
| 结构型模式 | 关注类 / 对象的组合结构,优化组织关系 | 适配器、装饰器、代理、外观、桥接、组合、享元 |
| 行为型模式 | 关注对象间的通信与职责分配,梳理交互逻辑 | 策略、模板方法、观察者、迭代器、责任链、命令、备忘录、状态、访问者、中介者、解释器 |
三、三大类设计模式核心详解(高频实战版)
(一)创建型模式:掌控对象诞生
1. 单例模式(Singleton)
- 场景:全局唯一实例(如数据库连接池、配置类、线程池)
- 核心:构造器私有,提供全局访问点
- 实现:饿汉式、懒汉式、双重校验锁、静态内部类、枚举单例
- 实战 :Java 中
Runtime类、Spring 中 Bean 默认单例
2. 工厂模式家族
- 简单工厂:一个工厂生产所有产品,适合产品少的场景
- 工厂方法:一个产品对应一个工厂,符合开闭原则
- 抽象工厂 :生产多个产品族,如
SQLFactory生产Connection+Statement - 实战 :JDBC 的
DriverManager、Spring 的BeanFactory
3. 建造者模式(Builder)
- 场景:创建复杂对象(多参数、可选参数),分离构建与表示
- 实战 :Lombok 的
@Builder、MyBatis 的SqlSessionFactoryBuilder
4. 原型模式(Prototype)
- 场景:对象创建成本高,通过克隆复用现有实例
- 实战 :Java 的
Cloneable接口、深拷贝 / 浅拷贝实现
(二)结构型模式:优化代码结构
1. 适配器模式(Adapter)
- 场景:兼容不匹配的接口,如旧接口对接新系统
- 分类:类适配器(继承)、对象适配器(组合)
- 实战 :SpringMVC 的
HandlerAdapter、JDBC 适配不同数据库驱动
2. 装饰器模式(Decorator)
- 场景:动态增强对象功能,不改变原有结构
- 对比代理 :装饰器是增强自身 ,代理是控制访问
- 实战 :Java IO 流(
BufferedReader装饰FileReader)
3. 代理模式(Proxy)
- 场景:远程代理、虚拟代理、权限控制、日志增强
- 分类:静态代理、JDK 动态代理、CGLIB 动态代理
- 实战:Spring AOP、MyBatis 的 Mapper 代理
4. 外观模式(Facade)
- 场景:封装复杂子系统,提供统一入口
- 实战 :Spring 的
ApplicationContext、Dubbo 的服务门面
5. 其他结构型
- 桥接模式:分离抽象与实现,如 JDBC 桥接不同数据库
- 组合模式:处理树形结构,如文件系统、菜单层级
- 享元模式:共享细粒度对象,减少内存占用,如 String 常量池、线程池
(三)行为型模式:梳理对象交互
1. 策略模式(Strategy)
- 场景:多种算法可互换,如支付方式、排序算法
- 核心:定义算法族,客户端动态选择
- 实战 :Spring 的
InstantiationStrategy、电商促销策略
2. 观察者模式(Observer)
- 场景:一对多依赖,主体变化通知所有观察者
- 实战 :MQ 消息订阅、Spring 的
ApplicationEvent、Vue 响应式
3. 责任链模式(Chain of Responsibility)
- 场景:多个对象处理同一请求,依次传递
- 实战:Servlet Filter、MyBatis 插件链、Spring MVC 拦截器
4. 模板方法模式(Template Method)
- 场景:固定流程骨架,可变步骤子类实现
- 实战 :Spring 的
JdbcTemplate、MyBatis 的BaseExecutor
5. 其他行为型
- 命令模式:封装请求为对象,支持撤销 / 排队,如 Redis 事务
- 迭代器模式 :遍历集合,不暴露底层结构,Java 集合的
Iterator - 状态模式:对象行为随状态改变,如订单状态流转
- 备忘录模式:保存 / 恢复对象状态,如游戏存档、编辑撤销
- 中介者模式:减少对象间耦合,通过中介通信,如 MQ 中介
- 访问者 / 解释器:低频次使用,适用于语法解析、报表生成
四、设计模式实战选型指南
1. 后端高频选型速记
- 全局唯一实例 → 单例模式
- 动态创建不同对象 → 工厂模式
- 接口不兼容对接 → 适配器模式
- 动态增强方法功能 → 装饰器 / 代理模式
- 复杂流程封装 → 外观模式
- 多算法切换 → 策略模式
- 事件通知 / 订阅 → 观察者模式
- 多级过滤 / 校验 → 责任链模式
2. 避坑指南
- 不要为了用模式而用模式:简单业务直接实现,过度设计会增加复杂度
- 优先遵循设计原则:原则是底层逻辑,模式是上层应用
- 结合框架使用:Spring、MyBatis 等框架已内置大量模式,理解模式可快速掌握框架原理
五、设计模式学习误区
- 死记硬背代码:重点理解适用场景 和设计思想,而非代码实现
- 认为模式越多越好:简单系统用基础模式即可,复杂架构再分层组合
- 忽视语言特性:不同语言(Java/Go/Python)的模式实现有差异,结合语言特性落地
六、总结
设计模式是软件设计的通用语言 ,不是僵化的规则,而是解决问题的工具。学习设计模式的核心是理解背后的设计原则 ,结合业务场景灵活选型,最终写出高内聚、低耦合、易维护的优质代码。