谈谈你了解的最常见的几种设计模式,说说他们的应用场景

常见设计模式 & 应用场景(面试Markdown,后端面试高频)

设计模式分三大类:创建型、结构型、行为型,挑开发中最常用的来讲,结合业务+Spring源码场景。

一、创建型模式:负责对象的创建

1. 单例模式

作用 :保证一个类全局只有一个实例,提供全局访问点。

场景:

  • 工具类、配置管理器、线程池、数据库连接池
  • Spring中默认Bean就是单例
    实现:饿汉、DCL双重检查锁、静态内部类、枚举单例(防反射序列化)

2. 工厂模式(简单工厂、工厂方法、抽象工厂)

1)简单工厂:一个工厂类,根据参数创建不同对象。

缺点:新增产品要修改工厂代码,违反开闭原则。

场景:简单对象创建,业务变化不大。

2)工厂方法:一个产品对应一个工厂,每个工厂只生产一种产品。

场景:产品经常新增,比如多种消息发送:短信、邮件、站内信。

3)抽象工厂 :生产一组相关对象。

场景:整套组件,比如不同操作系统的按钮、输入框组件。
Spring BeanFactory就是工厂模式的体现。

3. 建造者模式

作用 :分步构建复杂对象,隔离对象构建和表示,同样构建过程可以产出不同对象。

场景:

  • 对象属性多,构造函数参数爆炸;比如Builder构建实体、DTO
  • 例子:MyBatis中SqlSessionFactoryBuilder,Lombok的@Builder注解。

二、结构型模式:类/对象组合,组装成更大结构

1. 代理模式

分为静态代理、动态代理(JDK动态代理、CGLIB)

作用 :给目标对象提供代理对象,在不修改原有代码前提下做增强。

场景:

  • AOP切面、日志、权限校验、事务控制、埋点统计
  • Spring AOP底层就是动态代理。

JDK代理:基于接口;CGLIB:继承子类实现。

2. 装饰器模式

作用 :动态给对象增加额外功能,比继承更灵活。

场景 :IO流BufferedInputStream包装原始流;给原有对象叠加额外能力,不改动原有类。

3. 适配器模式

作用 :把一个类的接口,转换成客户端期望的另一个接口,做兼容适配。

场景:

  • 接入第三方接口,第三方返回格式和我们系统不匹配,写适配器做转换
  • SpringMVC HandlerAdapter适配不同处理器。

4. 组合模式

作用 :树形结构,统一对待叶子节点和容器节点。

场景:菜单树、部门组织树、文件目录。

三、行为型模式:对象之间通信、算法、流程控制

1. 策略模式

作用 :把多种算法抽成策略接口实现,运行时动态替换,消灭大量if‑else。

场景:多种支付方式、多种折扣算法、多种导出方式。

Spring大量使用,比如Comparator。

2. 模板方法模式

作用 :父类定义固定流程骨架,可变步骤交给子类实现,final保证流程不被篡改,基于继承。

场景:流程固定,部分步骤不同;文件导入导出任务。

Spring:JdbcTemplate就是典型模板方法。

3. 观察者模式(发布‑订阅)

作用 :一对多,主题变化,所有订阅者自动收到通知。

场景:事件通知、消息推送、事件监听。

Spring事件机制、MQ思想,GUI事件监听。

4. 责任链模式

作用 :多个处理者组成链条,请求沿着链条依次处理,可以传递或者终止。

场景:过滤器、拦截器、权限校验链、审批流程。

SpringMVC Filter、Interceptor,MyBatis插件链。

5. 迭代器模式

作用 :统一遍历集合,对外隐藏底层集合结构。

场景:Java集合的Iterator迭代器。

6. 命令模式

把请求封装成对象,可以保存、排队、撤销。

场景:任务队列、撤销重做操作。


面试口述总结(可以直接背)

我平时接触比较多的分为创建、结构、行为三类。

创建型最常用单例、工厂、建造者,主要解决对象创建问题;单例保证全局唯一实例,工厂封装对象创建逻辑,建造者用于构建复杂多属性对象。

结构型常用代理、适配器、装饰器;代理用于功能增强,SpringAOP就是动态代理;适配器用来兼容不同接口;装饰器动态扩展对象能力。

行为型里面策略、模板方法、责任链、观察者 用得最多。

策略模式用来消除if‑else,动态切换算法;模板方法父类固定流程骨架,子类实现可变步骤;责任链适合一层层校验处理;观察者实现事件的发布订阅解耦。

很多设计模式在Spring、MyBatis源码中都有落地。

相关推荐
承渊政道1 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(开源大模型ChatGLM高级定制化应用实战)
人工智能·pytorch·python·llm·模型微调·glm
Joy T2 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真6 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes6 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
Smoothcloud润云7 小时前
PyTorch大模型权重加载与启动耗时优化实战:定位磁盘、内存与显存瓶颈
人工智能·pytorch·python·深度学习·gpu算力
databook7 小时前
从循环到向量化:NumPy提速的7个关键思维
python·数据分析·numpy
棉猴8 小时前
玩游戏学Python1-Python和pgzero库的安装
python·pygame·玩游戏·pgzero·pgzrun
诺伦8 小时前
GEO优化数据实证:78%引用流向官网的机制拆解与小品牌三步管线实战教程 | RiseClaw玄策
python·seo·geo·内容营销·ai搜索
oooost8 小时前
pytorch学习笔记1
python·学习方法