当前位置: 首页 > web >正文

Java设计模式面试题详解

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

  • Java设计模式面试题详解
    • 一、设计模式基础概念
      • 1. 设计模式的三大分类
      • 2. SOLID原则
    • 二、高频创建型模式面试题
      • 1. 单例模式(Singleton)
      • 2. 工厂方法模式(Factory Method)
      • 3. 建造者模式(Builder)
    • 三、高频结构型模式面试题
      • 1. 代理模式(Proxy)
      • 2. 适配器模式(Adapter)
      • 3. 装饰器模式(Decorator)
    • 四、高频行为型模式面试题
      • 1. 观察者模式(Observer)
      • 2. 策略模式(Strategy)
      • 3. 责任链模式(Chain of Responsibility)
    • 五、综合面试题
      • 1. Spring框架中的设计模式应用
      • 2. 如何选择设计模式?
      • 3. 设计模式六大原则实践
    • 六、高频面试题汇总


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

Java设计模式面试题详解

在这里插入图片描述

一、设计模式基础概念

1. 设计模式的三大分类

  • 创建型模式:处理对象创建机制(5种)
  • 结构型模式:处理对象组合(7种)
  • 行为型模式:处理对象间通信(11种)

2. SOLID原则

原则全称解释
SRP单一职责原则一个类只负责一个功能领域
OCP开闭原则对扩展开放,对修改关闭
LSP里氏替换原则子类可替换父类
ISP接口隔离原则客户端不应依赖不需要的接口
DIP依赖倒置原则依赖抽象而非具体实现

二、高频创建型模式面试题

1. 单例模式(Singleton)

问题:如何实现线程安全的单例?

// 双重检查锁定实现
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

常见考点

  • volatile关键字的作用(禁止指令重排序)
  • 反射攻击的防御(私有构造器中检查实例)
  • 序列化破坏单例的解决方案(实现readResolve()方法)

2. 工厂方法模式(Factory Method)

问题:工厂方法模式与简单工厂的区别?

// 抽象工厂
interface CarFactory {Car createCar();
}// 具体工厂
class TeslaFactory implements CarFactory {public Car createCar() {return new Tesla();}
}class BMWFactory implements CarFactory {public Car createCar() {return new BMW();}
}

对比

特点简单工厂工厂方法
扩展性修改工厂类新增工厂类
符合OCP
复杂度

3. 建造者模式(Builder)

问题:建造者模式的适用场景?

// 使用示例
Computer computer = new Computer.Builder().setCPU("Intel i7").setRAM("32GB").setStorage("1TB SSD").build();

适用场景

  • 创建包含多个组成部分的复杂对象
  • 需要创建的对象有多个变体
  • 需要精确控制创建过程

三、高频结构型模式面试题

1. 代理模式(Proxy)

问题:JDK动态代理和CGLib代理的区别?

特性JDK动态代理CGLib代理
原理基于接口基于继承
速度较快首次慢,后续快
依赖需实现接口无接口要求
限制只能代理接口方法不能代理final方法

2. 适配器模式(Adapter)

问题:类适配器 vs 对象适配器

// 对象适配器实现
class EuropeanToAmericanAdapter implements AmericanPlug {private EuropeanPlug plug;public EuropeanToAmericanAdapter(EuropeanPlug plug) {this.plug = plug;}public void useAmericanOutlet() {plug.useEuropeanOutlet();// 转换逻辑...}
}

对比

  • 类适配器:通过继承实现(耦合度高)
  • 对象适配器:通过组合实现(更灵活)

3. 装饰器模式(Decorator)

问题:装饰器模式与代理模式的区别?

// 装饰器示例
public class EncryptionDecorator extends DataSourceDecorator {public EncryptionDecorator(DataSource source) {super(source);}@Overridepublic void writeData(String data) {super.writeData(encrypt(data));}private String encrypt(String data) {// 加密逻辑...}
}

区别

  • 装饰器:动态添加功能,关注对象增强
  • 代理:控制访问,关注访问过程

四、高频行为型模式面试题

1. 观察者模式(Observer)

问题:Java内置观察者API的缺点?

// Java 9+ 推荐实现
class NewsPublisher {private final List<Consumer<String>> listeners = new ArrayList<>();public void addListener(Consumer<String> listener) {listeners.add(listener);}public void publishNews(String news) {listeners.forEach(listener -> listener.accept(news));}
}

内置API缺点

  • Observable是类而非接口
  • 没有线程安全保证
  • 通知顺序不可控
  • Java 9+已标记为过时

2. 策略模式(Strategy)

问题:如何消除if-else分支?

// 策略注册表
class PaymentStrategyFactory {private static final Map<String, PaymentStrategy> strategies = Map.of("ALIPAY", new AlipayStrategy(),"WECHAT", new WechatPayStrategy(),"CREDIT", new CreditCardStrategy());public static PaymentStrategy getStrategy(String type) {return strategies.getOrDefault(type, new DefaultStrategy());}
}

应用场景

  • 支付方式选择
  • 排序算法切换
  • 折扣计算策略

3. 责任链模式(Chain of Responsibility)

问题:Spring中如何实现责任链?

// Spring实现示例
@Component
@Order(1)
class ValidationFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {// 验证逻辑...chain.doFilter(request, response);}
}@Component
@Order(2)
class LoggingFilter implements Filter {public void doFilter(Request request, Response response, FilterChain chain) {// 日志记录...chain.doFilter(request, response);}
}

Spring特性

  • 使用@Order注解定义顺序
  • 自动注入FilterChain实现
  • 支持中断处理链

五、综合面试题

1. Spring框架中的设计模式应用

模式Spring应用场景
工厂BeanFactory
代理AOP实现
单例Bean默认作用域
模板JdbcTemplate
适配器HandlerAdapter
观察者ApplicationEvent
策略Resource接口实现

2. 如何选择设计模式?

  1. 分析需求:明确要解决的问题类型
  2. 匹配模式
    • 创建对象 → 工厂/建造者
    • 组合对象 → 组合/装饰器
    • 对象交互 → 观察者/中介者
  3. 评估扩展性:考虑未来变化需求
  4. 权衡复杂度:避免过度设计

3. 设计模式六大原则实践

// 依赖倒置原则示例
interface MessageSender {void send(String message);
}class EmailSender implements MessageSender {public void send(String message) { /* 邮件发送 */ }
}class NotificationService {private final MessageSender sender; // 依赖抽象public NotificationService(MessageSender sender) {this.sender = sender;}public void sendNotification(String msg) {sender.send(msg);}
}

六、高频面试题汇总

  1. 单例模式如何防止反射攻击?

    • 在私有构造器中检查实例是否存在
    • 如果已存在则抛出异常
  2. Spring Bean是线程安全的吗?

    • 默认单例Bean不是线程安全的
    • 解决方案:使用原型作用域、ThreadLocal或同步控制
  3. 装饰器模式和代理模式的主要区别?

    • 装饰器:关注增强对象功能
    • 代理:关注控制对象访问
  4. 观察者模式在哪些实际场景中使用?

    • GUI事件处理
    • 消息队列发布-订阅
    • 电商系统库存通知
  5. 如何实现策略模式的无缝切换?

    • 使用枚举或注册表管理策略
    • 结合Spring的依赖注入
  6. 模板方法模式中钩子方法的作用?

    • 提供默认空实现
    • 允许子类选择性覆盖特定步骤

掌握设计模式的关键在于理解其应用场景解决的问题,而非死记硬背实现代码。在面试中结合项目经验说明模式应用会更有说服力。


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

http://www.xdnf.cn/news/12955.html

相关文章:

  • 第十二讲 | 二叉搜索树
  • 庖丁解java(一篇文章学java)
  • 风控系统中常用的概念和架构学习
  • golang循环变量捕获问题​​
  • Ⅱ.楔子 -- C♭和 cbc
  • 经典算法:排序链表
  • DQN算法(详细注释版)
  • 开源项目实战学习之YOLO11:12.7 ultralytics-models-transformer.py
  • SpringMVC简介
  • 【GPT模型训练】第一课:安装PyTorch环境
  • PandasAI使用
  • Doris-2:单虚拟机上非docker化安装Doris实验环境
  • 万利达电动机保护器接ModbusRTU转profibusDP网关与300PLC通讯
  • 2025-06-02-数据库的分类和应用
  • 大数据(3) 分布式文件系统HDFS
  • LeetCode 2894.分类求和并作差
  • 什么是函数对象
  • 【ArcGIS技巧】—村庄规划规划用地规划状态字段生成工具
  • 并发请求函数batchRequests
  • 类加载的过程
  • 【算法笔记】树套树
  • RSA和AES算法核心区别和原理解析
  • Python地理数学可视化:基于函数生成真实感地形
  • WebFuture 升级提示“不能同时包含聚集KEY和大字段””的处理办法
  • 【Docker 02】Docker 安装
  • 71常用控件_QHBoxLayout的使用
  • 浅谈未来汽车电子电气架构发展趋势中的通信部分
  • 【无人机】MavLink通讯协议的回调解析函数及状态机
  • AtCoder Beginner Contest 409(ABCDEF)
  • 深入解析对比学习:原理、应用与技术实现