创建型设计模式在依赖注入环境(如 SpringBoot)中是否无用?

Are creational design patterns useless in Dependency Injection environment ( like SpringBoot)?

我正在研究设计模式,有一刻我突然想到,大多数创建模式(如 Factory 和 Abstract Factory)在我们通常不创建对象的依赖注入环境中用处不大使用 new 关键字,但从某些上下文中“注入”它们。我也明白我很可能是错的,我需要一个很好的解释来把事情弄清楚。

像 Spring 这样的 DI 框架初始化和管理 bean。创建模式可用于创建域(业务)对象。

你没有看错。 GoF 书中有五种创建模式,作为 Java 开发人员,您可能永远不会使用其中任何一种。

  1. Abstract Factory - 依赖注入肯定会减少(如果不是消除的话)对这种模式的需求。 Service Locator is an Anti-Pattern and if you take a step further to ask Is the Service Locator pattern any different from the Abstract Factory pattern? 答案是 不是
  2. Builder 是您 可能在 Java、 但不是版本中使用的模式在 GoF 书中。作为 Java 开发人员,您很可能会从 Effective Java 中实施 Josh Bloch 的版本(或者让 Lombok 为您实施)。参见:How to implement the Builder Design Pattern in the right way?
  3. 工厂方法 只是模板方法模式的创建版本。虽然这仍然是一个有用的模式,但它从根本上是基于继承的;我们现在都知道 prefer composition over inheritance.
  4. Prototype 是一种高度特定于语言的模式。在其他语言中,这是至关重要的。在 Java 中,没那么多。 and the Prototype bean lifestyle implemented by Spring is not equivalent 到 GoF 模式。
  5. Singleton 是 GoF 模式的 divisive, even amongst the GoF themselves. It is widely considered an anti-pattern today. You are far more likely to utilize the Singleton bean lifestyle implemented by Spring, which (again) is not equivalent

使用依赖注入/控制反转框架,例如Spring确实减少了对The Gang of四种创造模式,但可能不会消除它们。

首先,让我们注意到 Spring 支持一个名为“Singleton”的作用域(实例创建模式)。虽然它的实施与 GOF 建议的有所不同,但许多想法是相同的。在这种情况下,如果 Spring 在你的项目中普遍存在,你就不需要 GOF 单例。如其他地方所述,开发人员应警惕单例滥用,因为单例会导致静态、不可测试和不可配置的代码。

接下来,抽象工厂 用于创建相关产品的整个系列。 GOF 书中甚至没有提到 1 产品简化类型。我想他们认为它已经太出名了。在 Spring 环境中,您通常会使用 Spring 来注入您需要的产品,而不是通过工厂创建它,但在某些情况下,您将改为注入工厂,然后从中创建产品!

Prototype 是另一个令人困惑的问题。 GOF 模式很少用在有反射的语言中,因为它们确实有其他方法,尽管不一定是创建对象副本的更好方法。令人困惑的一点是 Spring 使用“Prototype”这个词来表示一个不是单例的 Bean,我猜是因为他们最初假设这个 Bean 的所有新实例本质上都是一样的。

工厂方法 通常在框架中使用,在应用程序级代码中较少使用。它让框架的用户在框架选择创建对象时决定创建哪种对象。 Spring 实际上做了一些非常相似但没有继承的事情。当你将一个函数标记为@Bean时,Spring在它想要创建一个新实例时调用你的函数,用Spring的反射和拦截替换Factory Method的继承机制。