为什么 Spring 不让你直接 `new` 对象?
核心创建一系列相关或相互依赖的对象家族。场景: 现在的用户很挑剔。买 iPhone 必须配 iOS 系统和 Lightning 线;买华为必须配鸿蒙和 Type-C 线。这是成套的(产品族)。如果用上面的工厂方法,你可能造出了 iPhone,却配了 Android 系统(不兼容)。抽象工厂iPhoneiOSLightning。代码// 苹果工厂保证产出的手机和系统是配套的应用: 适合换“皮肤”、换

在 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)
工厂模式的灵魂在于 “控制反转”:
- 以前: 我需要对象,我主动去
new。我不仅是使用者,还是生产者。 - 现在: 我需要对象,我找工厂要。工厂给我什么,我就用什么。
一句话总结:简单工厂是“小作坊”,工厂方法是“专卖店”,抽象工厂是“生态圈”,而 Spring 是“上帝”。
更多推荐




所有评论(0)