
1. 项目背景与价值最近在整理Java设计模式相关的面试资料时发现市面上的内容要么过于零散要么缺乏系统性。作为一名经历过多次技术面试的Java开发者我深知设计模式在面试中的重要性——它不仅能考察候选人的编码能力更能反映其系统设计思维。因此我决定对常见的25道设计模式面试题进行结构化整理按照GoF的经典分类法创建型/结构型/行为型组织并补充综合问题与设计原则。这份资料特别适合准备Java中高级岗位面试的开发者需要系统性复习设计模式的团队希望深入理解设计模式应用场景的技术人员2. 内容架构设计2.1 分类逻辑说明采用GoF经典三分法创建型模式5种对象实例化的艺术结构型模式7种类与对象的组合方式行为型模式11种对象间的交互与职责分配额外增加综合问题模式对比与组合应用设计原则SOLID等基础理论2.2 题目筛选标准高频出现于大厂技术面覆盖所有23种经典模式包含至少2道开放设计题区分基础题与深度题3. 创建型模式专题3.1 单例模式的线程安全实现典型问题请写出三种线程安全的单例实现方式并分析优劣参考答案// 1. 饿汉式类加载时初始化 public class Singleton { private static final Singleton INSTANCE new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } // 2. DCL双检锁 public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } } // 3. 静态内部类 public class Singleton { private Singleton() {} private static class Holder { static final Singleton INSTANCE new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; } }对比分析实现方式线程安全懒加载性能适用场景饿汉式是否最优确定立即使用的场景DCL是是较高JDK1.5环境内部类是是优标准实现推荐特别注意JDK1.5之前volatile的内存语义不完善DCL实现可能存在隐患3.2 工厂方法 vs 抽象工厂典型问题在电商系统中支付方式与物流渠道需要支持多平台扩展应选用哪种工厂模式场景分析当产品有单一维度变化如仅支付方式→ 工厂方法当产品有多个关联维度支付物流需成套使用→ 抽象工厂代码示例// 抽象工厂实现 interface PaymentFactory { Payment createPayment(); Logistics createLogistics(); } class AlibabaFactory implements PaymentFactory { public Payment createPayment() { return new Alipay(); } public Logistics createLogistics() { return new Cainiao(); } }4. 结构型模式专题4.1 装饰器模式实践典型问题Java IO库中哪些类使用了装饰器模式为什么要这样设计关键点典型应用BufferedInputStream包装FileInputStream优势动态扩展功能避免类爆炸特点保持相同接口透明增强功能手写实现abstract class Coffee { abstract double cost(); } class SimpleCoffee extends Coffee { double cost() { return 10; } } abstract class CoffeeDecorator extends Coffee { protected Coffee decorated; public CoffeeDecorator(Coffee coffee) { this.decorated coffee; } } class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee coffee) { super(coffee); } double cost() { return decorated.cost() 2; } }4.2 代理模式对比典型问题动态代理与静态代理在RPC框架中如何选择对比维度类型实现方式适用场景性能开销静态代理手动编写代理类代理类固定低JDK动态代理Proxy.newProxyInstance基于接口中CGLIB字节码增强代理类无接口较高Spring AOP的默认策略有接口用JDK代理无接口用CGLIB5. 行为型模式专题5.1 观察者模式演进典型问题从Java内置Observer到Spring事件机制观察者模式有哪些演进发展路线java.util.Observable已废弃问题被观察者需继承具体类自定义接口实现优点解耦更彻底Spring ApplicationEvent优势支持异步/事务绑定/条件监听Spring事件示例Component class OrderService { Autowired ApplicationEventPublisher publisher; void createOrder() { publisher.publishEvent(new OrderCreatedEvent(this, orderId)); } } Component class NotificationListener { EventListener void handleEvent(OrderCreatedEvent event) { // 发送通知 } }5.2 策略模式优化典型问题如何避免策略模式中大量的if-else判断解决方案注册表模式class StrategyFactory { private MapString, Strategy strategies new HashMap(); void register(String type, Strategy strategy) { strategies.put(type, strategy); } Strategy get(String type) { return strategies.get(type); } }Spring自动注入推荐Component public class StrategyContext { Autowired private MapString, Strategy strategyMap; }6. 综合问题精讲6.1 模式组合应用开放问题设计一个支持插件化的任务调度系统需要考虑哪些模式设计方案插件管理 → 组合模式任务创建 → 工厂方法执行策略 → 策略模式状态通知 → 观察者模式日志记录 → 装饰器模式6.2 设计原则考察高频问题用具体案例说明接口隔离原则(ISP)的应用典型案例// 违反ISP interface Worker { void code(); void test(); void deploy(); } // 遵循ISP interface Developer { void code(); } interface Tester { void test(); } interface DevOps { void deploy(); }7. 面试实战技巧7.1 问题回答结构推荐使用STAR-L法则Situation模式的应用场景Task需要解决的问题Action模式的具体实现Result带来的收益Lesson可能的改进空间7.2 常见陷阱规避不要混淆相似模式如代理vs装饰器避免死记硬背UML图结合具体业务场景说明承认模式的局限性如单例不利于测试8. 扩展学习建议源码级学习Spring中的模板方法模式JdbcTemplateMyBatis中的建造者模式SqlSessionFactoryBuilder现代演进响应式编程中的观察者模式变体函数式编程对策略模式的替代反模式认知过度设计导致的模式滥用单例模式在分布式环境中的失效问题这份资料经过三次大厂面试实战检验建议读者先尝试自行回答再对照参考答案查漏补缺。对于开放设计题可尝试用PlantUML画出类图再编码实现效果更佳。