设计模式面试题
本页只放设计模式面试标准回答、常见追问和知识点跳转。每个模式的原理、流程图、代码 Demo、商业场景和误用后果放在对应知识点页,深度验收看 设计模式从零到精通验收清单。
高频问题
| 面试题 | 标准回答 | 原理知识点 |
|---|---|---|
| 设计模式应该怎么从零学到生产级 | 先学会识别变化点,再理解创建型、结构型、行为型分别解决什么问题,最后结合支付、订单、导入、第三方接口、Spring 事务等真实场景判断该不该用。 | 从零到生产级掌握、从零到精通验收清单 |
| 怎么判断设计模式是否真正学懂 | 不能只背定义。真正学懂要能说明变化点是什么,不用会怎样,用了怎么隔离变化,新增需求改哪里,误用会带来什么成本,线上出问题怎么定位。 | 从零到精通验收清单 |
| 你怎么理解设计模式 | 设计模式是常见设计问题的经验总结,核心不是背 UML,而是识别变化点并隔离变化,让新增功能少改老代码,同时避免过度设计。 | 设计模式总览 |
| 单例模式适合什么场景 | 适合全局唯一、创建成本高、需要统一管理的对象,如配置管理器、连接池、线程池。Spring Bean 默认单例是容器级单例,不等于手写 JVM 全局单例。 | 单例模式 |
| 工厂模式解决什么问题 | 工厂模式封装对象创建和选择逻辑,让调用方依赖接口而不是具体实现。适合支付方式、消息发送器、文件解析器这类实现会扩展的场景。 | 工厂模式 |
| 建造者模式解决什么问题 | 建造者模式用于分步骤构建复杂对象,适合参数多、可选字段多、默认值多、需要统一校验或不可变对象的场景。 | 建造者模式 |
| 代理模式和装饰器模式区别 | 代理模式强调访问控制或横切增强,如事务、权限、远程代理;装饰器强调在不改原类的情况下动态叠加能力,如 Java IO。结构都可能包一层,但意图不同。 | 代理模式、装饰器模式 |
| 适配器模式适合什么场景 | 适配器用于把已有但不兼容的接口转换成统一接口,常见于第三方系统、老系统改造、多供应商接入。 | 适配器模式 |
| 策略模式解决什么问题 | 策略模式把多种算法或业务规则封装成独立策略,运行时按类型选择。适合支付、折扣、导出格式、文件解析等同一件事多种做法的场景。 | 商业场景训练营、策略模式 |
| 观察者模式和 MQ 区别 | 观察者通常是进程内事件通知,适合本地扩展;MQ 是跨进程可靠消息系统,支持削峰、重试、持久化和异步解耦。跨服务通知不要用进程内观察者替代 MQ。 | 观察者模式、消息队列 |
| 模板方法模式和策略模式区别 | 模板方法固定流程骨架,把变化步骤交给子类;策略模式是在多个算法中选择一个执行。模板方法强调流程顺序稳定,策略强调算法可替换。 | 模板方法模式、策略模式 |
| 责任链模式适合什么场景 | 责任链适合多个处理器按顺序处理同一个请求,如校验链、过滤器链、审批链、Spring Security 过滤器链。每个处理器职责单一,可新增处理器扩展规则。 | 商业场景训练营、责任链模式 |
项目话术
text
在项目里我不会为了模式而模式,而是先看变化点。比如支付、通知、文件解析这类多实现选择,我会用工厂配合策略;订单创建前有多项校验,我会用责任链;数据导入流程固定但不同来源解析不同,我会用模板方法;对接不同医院或第三方供应商接口,我会用适配器;事务、日志、权限这类横切增强,Spring AOP 本质就是代理模式。每次引入模式都会关注是否真的减少修改面,以及是否增加了不必要的理解成本。常见追问
| 追问 | 回答方向 | 跳转 |
|---|---|---|
| 设计模式会不会过度设计 | 会。只有变化点真实存在、扩展会持续发生、抽象能减少修改面时才引入。简单逻辑直接写清楚更好。 | 设计模式总览 |
| 工厂和策略怎么组合 | 工厂负责根据类型找到策略对象,策略负责执行业务逻辑。 | 工厂模式、策略模式 |
| Spring 事务为什么是代理模式 | 外部调用进入代理对象,代理在目标方法前后开启、提交或回滚事务。自调用不经过代理,所以事务可能失效。 | 代理模式、Spring事务 |
| 责任链怎么排查问题 | 明确处理器顺序、每个处理器职责、是否中断、异常策略和日志。链路过长时必须有链路日志。 | 责任链模式 |
| 适配器里能写业务吗 | 不建议。适配器主要做协议、字段、错误码转换,业务规则应放 Service 或领域层。 | 适配器模式 |
怎么判断设计模式是否真正学懂
| 验收问题 | 合格回答方向 | 深度知识点 |
|---|---|---|
| 什么时候不要用设计模式 | 变化点不真实、短期不会扩展、抽象后没有减少修改面时不要用。 | 从零到精通验收清单 |
| 工厂和策略怎么配合 | 工厂负责找到对象,策略负责执行业务规则;支付、通知、文件解析常组合使用。 | 从零到精通验收清单 |
| Spring 事务为什么是代理 | 外部调用进入代理对象,代理在目标方法前后做事务增强;同类自调用没经过代理会失效。 | 从零到精通验收清单 |
| 观察者和 MQ 边界是什么 | 本地观察者适合进程内扩展,跨服务可靠通知要用 MQ。 | 从零到精通验收清单 |
| 责任链怎么排查问题 | 查处理器顺序、中断策略、异常是否被吞、每个处理器日志。 | 从零到精通验收清单 |
面试回答模板
text
我回答设计模式时会先说业务问题,再说模式怎么隔离变化,最后说代价和边界。例如策略模式不是为了消灭所有 if,而是当同一业务有多种规则并且会持续扩展时,把规则拆成独立策略;责任链不是把所有逻辑拆散,而是适合一组有顺序、可插拔的处理步骤;适配器不是代理,它重点解决接口不兼容。设计模式的核心是判断力,不是套模板。本章小结
面试页负责“怎么说”,知识点页负责“为什么”。不要只背定义,要能结合项目说明:变化点是什么、不用会怎样、用了怎么落地、用了会带来什么成本。完整验收按 设计模式从零到精通验收清单 逐项检查。
