欢迎光临
我们一直在努力

为什么 Spring 不让你直接 `new` 对象?


在 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)
    未经允许不得转载:171主机测评 » 为什么 Spring 不让你直接 `new` 对象?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址