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)的模式实现有差异,结合语言特性落地

六、总结

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

相关推荐
崎岖Qiu2 小时前
【计算机网络 | 第二篇】三种交换方式和互联网的核心部分
网络·笔记·计算机网络·路由器
Warren982 小时前
一次文件上传异常的踩坑、定位与修复复盘(Spring Boot + 接口测试)
java·开发语言·spring boot·笔记·后端·python·面试
丝斯20112 小时前
AI学习笔记整理(69)——物理AI中世界模型
人工智能·笔记·学习
凯尔萨厮2 小时前
软件23种设计模式(学习笔记)
笔记·学习·设计模式
短剑重铸之日2 小时前
《设计模式》第八篇:三大类型之创建型模式
java·后端·设计模式·创建型设计模式
晚霞的不甘2 小时前
Flutter for OpenHarmony3D DNA 螺旋可视化:用 Canvas 构建沉浸式分子模型
前端·数据库·经验分享·flutter·3d·前端框架
AI营销前沿3 小时前
AI市场分析平台榜单发布:原圈科技如何破解全球化增长难题?
笔记
宝宝单机sop12 小时前
Ai 算法资源合集
经验分享
计算机小手12 小时前
一个带Web UI管理的轻量级高性能OpenAI模型代理网关,支持Docker快速部署
经验分享·docker·语言模型·开源软件