网站首页 > 精选教程 正文
一、高频设计模式与核心原理
1.单例模式
问题:如何实现线程安全的单例模式?请列举至少三种方式并说明优缺点。
答案:
- 饿汉式:类加载时即创建实例,线程安全但可能浪费内存。
- public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
- 双重检查锁(DCL):延迟加载且线程安全,需用volatile防止指令重排序56。
- 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; } }
- 枚举:简洁且天然线程安全,推荐使用610。
- public enum Singleton { INSTANCE; }
应用场景:数据库连接池、日志管理器等重量级对象管理15。
2.工厂模式
问题:工厂模式与抽象工厂模式的区别是什么?
答案:
- 工厂方法:针对单一产品等级结构(如“汽车”),由子类决定实例化哪个类610。
- 抽象工厂:针对多个产品族(如“汽车+轮胎”),提供一个接口创建相关依赖对象59。
代码示例(简单工厂):
public class PizzaFactory {
public static Pizza createPizza(String type) {
if ("cheese".equals(type)) return new CheesePizza();
else return new VeggiePizza();
}
}
应用场景:Spring框架的BeanFactory、JDK的Calendar.getInstance()210。
3.观察者模式
问题:观察者模式在Java中有哪些实际应用?
答案:
- Swing事件监听:按钮点击事件触发多个监听器。
- Spring事件驱动:ApplicationEvent与ApplicationListener实现发布-订阅机制69。
UML核心角色:
- Subject(主题):维护观察者列表,提供注册/通知方法。
- Observer(观察者):定义更新接口(如update())。
4.装饰器模式
问题:装饰器模式与适配器模式的区别?
答案:
- 装饰器:增强对象功能(如Java IO的BufferedReader包装FileReader)46。
- 适配器:转换接口兼容性(如InputStreamReader将字节流转为字符流)410。
代码示例(装饰器):
public class BufferedLogger implements Logger {
private Logger logger;
public BufferedLogger(Logger logger) { this.logger = logger; }
@Override
public void log(String message) {
String bufferedMsg = "[Buffered] " + message;
logger.log(bufferedMsg);
}
}
二、设计原则与实战应用
1.SOLID原则
- 单一职责原则:一个类只负责一项功能(如订单管理类拆分状态处理与支付逻辑)15。
- 开闭原则:通过扩展而非修改实现新功能(如策略模式动态替换算法)46。
- 依赖倒置:高层模块依赖抽象(接口),而非具体实现(如Spring依赖注入)510。
2.Spring框架中的设计模式
- 原型模式:@Scope("prototype")注解实现Bean多例1。
- 代理模式:AOP基于动态代理(JDK/CGLib)实现日志、事务管理59。
- 模板方法模式:JdbcTemplate封装数据库操作流程,子类实现具体步骤58。
三、面试进阶问题
1.如何设计一个支持多状态的订单系统?
答案:
- 状态模式:将订单状态抽象为独立类(如OrderState接口),每个状态实现具体行为(审核、发布、抢单)。
- 优势:消除if-else分支,新增状态只需扩展新类,符合开闭原则15。
public interface OrderState {
void handle(OrderContext context);
}
public class ReviewedState implements OrderState {
@Override
public void handle(OrderContext context) {
context.setState(new PublishedState());
}
}
2.解释器模式的应用场景?
答案:
- 定义:用于解析特定语法规则(如SQL解析、正则表达式)。
- Spring中的应用:SpEL(Spring Expression Language)解析表达式14。
四、总结与学习建议
- 高频考点:单例、工厂、观察者、装饰器模式及SOLID原则。
- 实战结合:结合Spring源码理解模式应用(如AOP、Bean作用域)。
- 避坑指南:避免过度设计,根据场景选择模式(如简单场景用工厂,复杂场景用抽象工厂)。
立即行动:关注博主并转发本文,私信“设计模式”获取《Java设计模式实战手册》+源码案例!
参考来源:
- CSDN:Java设计模式面试题整理1
- Java设计模式11道常见面试题2
- 阿里P9架构师推荐资源3
猜你喜欢
- 2025-03-14 「年底备战」Java 高级面试题之Java基础(附答案详解)
- 2025-03-14 Java编程面试常见问题和答案(一)(java面试编程题及答案)
- 2025-03-14 java程序设计练习题(二)附答案(java程序设计考试题及答案)
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)