在Java大厂面试中,设计模式是考察候选人架构思维和代码设计能力的重要环节。本文将围绕工厂方法模式、策略模式与责任链模式展开深入剖析,结合面试常见问题与实战场景,帮助读者系统掌握这三种模式的原理、实现与应用。
工厂方法模式(Factory Method Pattern)定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。核心思想是将对象的创建与使用分离,符合开闭原则。
`java
// 产品接口
interface Logger {
void log(String message);
}
// 具体产品
class ConsoleLogger implements Logger {
public void log(String message) {
System.out.println("Console: " + message);
}
}
class FileLogger implements Logger {
public void log(String message) {
System.out.println("File: " + message);
}
}
// 抽象工厂
abstract class LoggerFactory {
public abstract Logger createLogger();
public void logMessage(String message) {
Logger logger = createLogger();
logger.log(message);
}
}
// 具体工厂
class ConsoleLoggerFactory extends LoggerFactory {
public Logger createLogger() {
return new ConsoleLogger();
}
}
class FileLoggerFactory extends LoggerFactory {
public Logger createLogger() {
return new FileLogger();
}
}`
- Q:工厂方法模式与简单工厂模式的区别?
A:简单工厂模式由一个工厂类负责创建所有产品,违反开闭原则;工厂方法模式将创建延迟到子类,新增产品只需新增具体工厂,符合开闭原则。
- Q:工厂方法模式在Spring中的应用?
A:Spring的BeanFactory通过getBean()方法返回不同类型的Bean,本质是工厂方法模式的应用;FactoryBean接口允许自定义Bean的创建逻辑。
- Q:何时选择工厂方法模式?
A:当系统需要独立于其产品的创建、组合和表示时;当产品类有多个变体且需要动态扩展时。
策略模式(Strategy Pattern)定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。核心思想是面向接口编程,将可变的算法抽象为策略接口。
`java
// 策略接口
interface DiscountStrategy {
double applyDiscount(double price);
}
// 具体策略
class NoDiscount implements DiscountStrategy {
public double applyDiscount(double price) { return price; }
}
class PercentageDiscount implements DiscountStrategy {
private double rate;
public PercentageDiscount(double rate) { this.rate = rate; }
public double applyDiscount(double price) { return price * (1 - rate); }
}
// 上下文
class PriceCalculator {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double calculate(double price) {
return strategy.applyDiscount(price);
}
}`
- Q:策略模式与if-else的区别?
A:策略模式将每个分支逻辑封装为独立类,避免臃肿的if-else,提升可维护性和可扩展性;但会增加类的数量,需权衡使用。
- Q:策略模式在JDK中的应用?
A:java.util.Comparator是典型的策略接口,Collections.sort()接受不同的Comparator实现作为排序策略;ThreadPoolExecutor的拒绝策略(RejectedExecutionHandler)也是策略模式。
- Q:如何避免策略模式导致的类爆炸?
A:可使用枚举实现策略,或结合工厂模式管理策略实例;在简单场景下可考虑使用函数式接口减少类定义。
责任链模式(Chain of Responsibility Pattern)将请求的发送者和接收者解耦,使多个对象都有机会处理请求。将这些对象连成一条链,并沿着链传递请求,直到有对象处理为止。
`java
// 抽象处理者
abstract class Approver {
protected Approver next;
public void setNext(Approver next) { this.next = next; }
public abstract void approve(int amount);
}
// 具体处理者
class Manager extends Approver {
public void approve(int amount) {
if (amount <= 1000) {
System.out.println("Manager approved: " + amount);
} else if (next != null) {
next.approve(amount);
}
}
}
class Director extends Approver {
public void approve(int amount) {
if (amount <= 5000) {
System.out.println("Director approved: " + amount);
} else if (next != null) {
next.approve(amount);
}
}
}`
- Q:责任链模式的优点和缺点?
A:优点:降低耦合度,增强灵活性,可动态增删处理者;缺点:请求可能未被处理,性能受链长度影响,调试复杂。
- Q:责任链模式在框架中的应用?
A:Spring MVC的HandlerInterceptor拦截器链、Servlet的Filter链、Netty的ChannelPipeline均为责任链模式的典型实现。
- Q:如何避免责任链形成循环?
A:在构建链时需确保next指向正确,可通过单链表结构或设置终止条件防止循环;实际框架中通常由容器管理链的构建过程。
| 模式 | 核心目的 | 适用场景 | 关键角色 |
|------|----------|----------|----------|
| 工厂方法模式 | 解耦对象创建与使用 | 产品类需动态扩展、创建逻辑复杂 | 抽象工厂、具体工厂 |
| 策略模式 | 封装可互换的算法 | 同一行为有多种实现且需动态切换 | 策略接口、上下文 |
| 责任链模式 | 解耦请求发送与处理 | 多个对象可能处理同一请求,需按序传递 | 抽象处理者、具体处理者 |
选型建议:
- 需要灵活创建对象时选择工厂方法模式。
- 需要运行时切换算法时选择策略模式。
- 需要按顺序处理请求且处理者不固定时选择责任链模式。
设计模式是Java大厂面试的必考内容,深入理解工厂方法模式、策略模式与责任链模式的原理、实现及典型应用场景,不仅能提升代码设计能力,也能在面试中展现良好的架构思维。建议结合实际项目与源码(如Spring、JDK)进行学习,做到知其然更知其所以然。
如若转载,请注明出处:http://www.wondercosy.com/product/40.html
更新时间:2026-11-01 21:16:02