在 Java 编程的初级阶段,我们最熟悉的动作就是 new
User user = new User();
Car car = new Car();

这看起来天经地义。但在架构师眼里,随处可见的 new 是代码耦合的万恶之源。

为什么?因为当你 new 一个对象时,你就把自己和这个具体的类**“锁死”**了。如果你想换成 UserV2 或者 ElectricCar,你需要改动成百上千个文件。

为了解耦,我们需要把“创建对象”的权力上交。这就是 工厂模式 (Factory Pattern)


🏭 一、演进史:从作坊到富士康

为了搞懂工厂模式的三种形态(简单工厂、工厂方法、抽象工厂),我们将 代码开发 比作 手机制造业

1. 原始阶段:自给自足 (No Pattern)

  • 代码: Phone p = new iPhone();
  • 场景: 你想用手机,你得自己在家里手搓一台 iPhone。
  • 痛点: 如果你想换华为,你得把手里的 iPhone 拆了,重新学怎么搓华为。使用者和生产者不分家,累死人。

2. 简单工厂 (Simple Factory) —— “路边小作坊”

  • 核心: 定义一个静态方法,通过参数判断造什么。

  • 场景: 你开了一家小作坊 PhoneFactory

  • 客户说:“我要 iPhone”。

  • 作坊里的 if ("iPhone") 分支生效,给你 new 一个 iPhone。

  • 客户说:“我要 Huawei”。

  • 作坊里的 if ("Huawei") 分支生效,给你 new 一个 Huawei。

  • 代码:

public class SimpleFactory {
    public static Phone createPhone(String type) {
        if ("iPhone".equals(type)) return new IPhone();
        else if ("Huawei".equals(type)) return new HuaweiPhone();
        return null;
    }
}

  • 缺点: 违背开闭原则 (OCP)。如果你想新增一个 “Xiaomi”,你必须修改工厂的源代码(加一个 else if)。万一改出 Bug,整个工厂都得停工。

3. 工厂方法 (Factory Method) —— “品牌专卖店”

  • 核心: 定义一个创建对象的接口,让子类决定实例化哪一个类。

  • 场景: 既然改代码危险,那我们搞加盟店

  • 定义一个标准接口 Factory

  • 开一家 AppleFactory,专门生产 iPhone。

  • 开一家 HuaweiFactory,专门生产 Huawei。

  • 代码:

// 想用苹果?先找苹果工厂
Factory factory = new AppleFactory();
Phone p = factory.createPhone(); // 产出 iPhone

  • 优点: 符合开闭原则。想增加小米?不需要动原来的代码,直接新建一个 XiaomiFactory 类就行。
  • 缺点: 类爆炸。每增加一种产品,就得增加一个工厂类。

4. 抽象工厂 (Abstract Factory) —— “生态代工厂”

  • 核心: 创建一系列相关或相互依赖的对象家族。

  • 场景: 现在的用户很挑剔。买 iPhone 必须配 iOS 系统和 Lightning 线;买华为必须配鸿蒙和 Type-C 线。这是成套的(产品族)。

  • 如果用上面的工厂方法,你可能造出了 iPhone,却配了 Android 系统(不兼容)。

  • 抽象工厂规定:AppleFactory 必须生产一套:iPhone + iOS + Lightning

  • 代码:

public interface ElecFactory {
    Phone createPhone();
    OS createOS();
}
// 苹果工厂保证产出的手机和系统是配套的
public class AppleFactory implements ElecFactory {
    public Phone createPhone() { return new IPhone(); }
    public OS createOS() { return new IOS(); }
}

  • 应用: 适合换“皮肤”、换“数据库”(MySQL/Oracle 全套切换)、换“操作系统”等场景。

🚀 二、实战:Spring 就是最大的工厂

你可能会觉得:“写这么多类太麻烦了,我还是直接 new 吧。”

但在企业级开发中,你几乎不用手写工厂,因为你有一个超级工厂 —— Spring IOC 容器

Spring 的 BeanFactory

  • 在 Spring 里,你写了 @Controller@Service
  • Spring 启动时,扫描这些注解,把它们全 new 出来,放在一个巨大的池子(容器)里。
  • 当你需要用 UserService 时,Spring 利用反射技术工厂模式,直接把对象塞给你(@Autowired)。

结论:Spring 本质上就是一个巨大的、通用的抽象工厂。它帮你管理了所有对象的“出生”和“死亡”。


🎯 三、总结:控制反转 (IoC)

工厂模式的灵魂在于 “控制反转”

  1. 以前: 我需要对象,我主动new。我不仅是使用者,还是生产者。
  2. 现在: 我需要对象,我找工厂要。工厂给我什么,我就用什么。

一句话总结:简单工厂是“小作坊”,工厂方法是“专卖店”,抽象工厂是“生态圈”,而 Spring 是“上帝”。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐