面试知识库
进阶

工厂模式#

一句话答案#

工厂模式将对象创建封装到工厂类中,解耦创建逻辑和使用逻辑。三种变体:简单工厂(一个工厂 + 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 的工厂
  • ❌ 所有场景都用工厂方法——简单场景用简单工厂就够了,别过度设计