当前位置: 首页 > 产品大全 > Java大厂面试专题 工厂方法模式、策略模式与责任链模式深度解析

Java大厂面试专题 工厂方法模式、策略模式与责任链模式深度解析

Java大厂面试专题 工厂方法模式、策略模式与责任链模式深度解析

引言

在Java大厂面试中,设计模式是考察候选人架构思维和代码设计能力的重要环节。本文将围绕工厂方法模式、策略模式与责任链模式展开深入剖析,结合面试常见问题与实战场景,帮助读者系统掌握这三种模式的原理、实现与应用。

一、工厂方法模式

1.1 定义与核心思想

工厂方法模式(Factory Method Pattern)定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。核心思想是将对象的创建与使用分离,符合开闭原则。

1.2 结构组成

  • Product:抽象产品接口,定义产品的公共行为。
  • ConcreteProduct:具体产品实现。
  • Creator:抽象工厂,声明工厂方法返回Product。
  • ConcreteCreator:具体工厂,重写工厂方法返回具体产品。

1.3 代码示例(Java)

`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();
}
}
`

1.4 大厂面试常见问题

- Q:工厂方法模式与简单工厂模式的区别?
A:简单工厂模式由一个工厂类负责创建所有产品,违反开闭原则;工厂方法模式将创建延迟到子类,新增产品只需新增具体工厂,符合开闭原则。

- Q:工厂方法模式在Spring中的应用?
A:Spring的BeanFactory通过getBean()方法返回不同类型的Bean,本质是工厂方法模式的应用;FactoryBean接口允许自定义Bean的创建逻辑。

- Q:何时选择工厂方法模式?
A:当系统需要独立于其产品的创建、组合和表示时;当产品类有多个变体且需要动态扩展时。

二、策略模式

2.1 定义与核心思想

策略模式(Strategy Pattern)定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。核心思想是面向接口编程,将可变的算法抽象为策略接口。

2.2 结构组成

  • Strategy:策略接口,定义算法方法。
  • ConcreteStrategy:具体策略实现。
  • Context:上下文,持有Strategy引用,可动态切换策略。

2.3 代码示例(Java)

`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);
}
}
`

2.4 大厂面试常见问题

- Q:策略模式与if-else的区别?
A:策略模式将每个分支逻辑封装为独立类,避免臃肿的if-else,提升可维护性和可扩展性;但会增加类的数量,需权衡使用。

- Q:策略模式在JDK中的应用?
A:java.util.Comparator是典型的策略接口,Collections.sort()接受不同的Comparator实现作为排序策略;ThreadPoolExecutor的拒绝策略(RejectedExecutionHandler)也是策略模式。

- Q:如何避免策略模式导致的类爆炸?
A:可使用枚举实现策略,或结合工厂模式管理策略实例;在简单场景下可考虑使用函数式接口减少类定义。

三、责任链模式

3.1 定义与核心思想

责任链模式(Chain of Responsibility Pattern)将请求的发送者和接收者解耦,使多个对象都有机会处理请求。将这些对象连成一条链,并沿着链传递请求,直到有对象处理为止。

3.2 结构组成

  • Handler:抽象处理者,定义处理请求的接口和设置后继者的方法。
  • ConcreteHandler:具体处理者,处理请求或转发给后继者。
  • Client:客户端,构建责任链并发送请求。

3.3 代码示例(Java)

`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);
}
}
}
`

3.4 大厂面试常见问题

- 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

产品大全

Top