23种设计模式

设计模式:后端开发必备设计思想

在后端开发、架构设计与代码重构中,设计模式 是解决特定场景下重复问题的可复用解决方案,是工程师从「会写代码」到「写好代码」的核心进阶技能。本文将系统梳理设计模式的分类、核心原则、23 种经典模式详解及实战选型,帮你构建完整的设计模式知识体系。

一、设计模式基础认知

1. 什么是设计模式

设计模式是前人总结的、经过验证的软件设计最佳实践 ,不是可直接调用的代码库,而是一套解决特定问题的思路与模板 。它关注类与对象的组织关系 ,目标是提升代码的可复用性、可扩展性、可维护性,降低耦合度。

2. 设计模式的四大作用

  • 解耦:分离模块依赖,避免牵一发而动全身
  • 复用:通用方案无需重复造轮子,减少冗余代码
  • 扩展:新增功能时无需修改原有代码,符合开闭原则
  • 可读:统一的设计范式,降低团队协作的沟通成本

3. 设计模式的七大设计原则

设计模式是原则的落地实践,先掌握原则再理解模式,事半功倍:

  1. 单一职责原则:一个类 / 方法只负责一项功能
  2. 开闭原则:对扩展开放,对修改关闭(核心原则)
  3. 里氏替换原则:子类可替换父类,不破坏原有逻辑
  4. 接口隔离原则:接口粒度细化,避免实现不需要的方法
  5. 依赖倒置原则:依赖抽象而非具体实现
  6. 迪米特法则(最少知道原则) :一个对象只与直接朋友通信
  7. 合成复用原则:优先使用组合 / 聚合,而非继承

二、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 等框架已内置大量模式,理解模式可快速掌握框架原理

五、设计模式学习误区

  1. 死记硬背代码:重点理解适用场景 和设计思想,而非代码实现
  2. 认为模式越多越好:简单系统用基础模式即可,复杂架构再分层组合
  3. 忽视语言特性:不同语言(Java/Go/Python)的模式实现有差异,结合语言特性落地

六、总结

设计模式是软件设计的通用语言 ,不是僵化的规则,而是解决问题的工具。学习设计模式的核心是理解背后的设计原则 ,结合业务场景灵活选型,最终写出高内聚、低耦合、易维护的优质代码。

相关推荐
Zhao-Jichao33 分钟前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李40 分钟前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga2 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd3 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白4 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李4 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Tt有了t5 小时前
设计模式速查
java·python·设计模式
一条Go5 小时前
四个进程,一把锁:Alioth 的告警评测为什么不需要消息队列
后端·设计模式·架构
Zhao-Jichao6 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
Z21-X7 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生