
在 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)
工厂模式的灵魂在于 “控制反转”:
一句话总结:简单工厂是“小作坊”,工厂方法是“专卖店”,抽象工厂是“生态圈”,而 Spring 是“上帝”。




