高 进阶
工厂模式#
一句话答案#
工厂模式将对象创建封装到工厂类中,解耦创建逻辑和使用逻辑。三种变体:简单工厂(一个工厂 + if/switch)、工厂方法(每个产品一个工厂)、抽象工厂(一个工厂创建一族产品)。
核心要点
三种工厂模式#
1. 简单工厂(静态工厂方法)#
public class PaymentFactory {
public static Payment create(String type) {
switch (type) {
case "alipay": return new AliPayment();
case "wechat": return new WechatPayment();
default: throw new IllegalArgumentException();
}
}
}
// 使用
Payment payment = PaymentFactory.create("alipay");java优点: 简单直接 缺点: 新增类型要改工厂代码(违反开闭原则)
2. 工厂方法(每个产品一个工厂)#
public interface PaymentFactory {
Payment create();
}
public class AliPaymentFactory implements PaymentFactory {
public Payment create() { return new AliPayment(); }
}
public class WechatPaymentFactory implements PaymentFactory {
public Payment create() { return new WechatPayment(); }
}java优点: 新增产品只需新增工厂类,不修改已有代码 缺点: 类爆炸
3. 抽象工厂(一族产品)#
public interface UIFactory {
Button createButton();
Dialog createDialog();
}
public class MacUIFactory implements UIFactory {
public Button createButton() { return new MacButton(); }
public Dialog createDialog() { return new MacDialog(); }
}
public class WinUIFactory implements UIFactory {
public Button createButton() { return new WinButton(); }
public Dialog createDialog() { return new WinDialog(); }
}java适用: 创建一组相关的对象(如同一风格的 UI 组件)
三者对比#
| 模式 | 工厂数 | 产品数 | 扩展性 |
|---|---|---|---|
| 简单工厂 | 1 个 | 多个 | 改工厂代码 |
| 工厂方法 | 多个(每产品一个) | 多个 | 新增工厂类 |
| 抽象工厂 | 多个(每族一个) | 多族 | 新增工厂族 |
在 Spring 中的应用#
- BeanFactory:Spring IoC 容器就是一个超级工厂
- FactoryBean:自定义对象创建逻辑(如 MyBatis 的 SqlSessionFactoryBean)
getBean()就是工厂方法的典型应用
面试回答(2分钟版)
工厂模式的核心是把对象创建逻辑封装到工厂类中,解耦创建和使用。它有三种递进的变体:简单工厂用一个工厂类加switch/if创建不同产品,简单直接但新增产品要改工厂代码违反开闭原则;工厂方法为每个产品定义一个工厂类,新增产品只需新增对应工厂不改已有代码,但类会爆炸;抽象工厂是每个工厂负责创建一族相关产品,比如MacUIFactory同时创建MacButton和MacDialog,适合需要保证产品族一致性的场景。在Spring中工厂模式的应用非常广泛:BeanFactory是整个IoC容器,本质就是一个超级工厂通过getBean()创建和管理所有Bean;FactoryBean是一个特殊接口,实现它可以自定义某个Bean的创建逻辑,比如MyBatis的SqlSessionFactoryBean。实际开发中最常用的是简单工厂加策略模式的组合。
追问与易错
追问方向:
- “简单工厂和工厂方法的区别?”→ 简单工厂集中创建(if/switch),工厂方法分散创建(每个产品一个工厂类)
- “Spring 中哪里用了工厂模式?”→ BeanFactory / FactoryBean / 各种 xxxFactory
易错点:
- ❌ 混淆 BeanFactory 和 FactoryBean——BeanFactory 是容器,FactoryBean 是创建特定 Bean 的工厂
- ❌ 所有场景都用工厂方法——简单场景用简单工厂就够了,别过度设计