java - 对这个工厂感到困惑,因为它看起来既不像抽象工厂也不像工厂方法

标签 java design-patterns dependency-injection guice

我正在研究 Guice,最近一直在阅读它的文档。

阅读motivation我不明白工厂部分,为什么他们这样命名。对我来说,工厂只是他们希望它在调用 getInstance() 后返回的实现类的包装器。

public class CreditCardProcessorFactory {

  private static CreditCardProcessor instance;

  public static void setInstance(CreditCardProcessor creditCardProcessor) {
    instance = creditCardProcessor;
  }

  public static CreditCardProcessor getInstance() {
    if (instance == null) {
      throw new IllegalStateException("CreditCardProcessorFactory not initialized. "
          + "Did you forget to call CreditCardProcessor.setInstance() ?");
    }

    return instance;
  }
}

如果它既不是抽象工厂也不是工厂方法(至少它们最初是由 GoF 定义的),为什么还要称它为工厂?还是我遗漏了什么?

谢谢。

编辑:如果有人想出更好的标题,我会很乐意更改它。

最佳答案

我是该文档的作者。我称它为工厂是为了与 JDK 类(如 DocumentBuilderFactory 和 TransformerFactory)保持一致。如果从未调用过 setInstance(),则该示例的先前修订版会返回默认实现:

  public static CreditCardProcessor getInstance() {
    if (instance == null) {
      return new SquareCreditCardProcessor();
    }
    return instance;
  }

我更改了它以避免从工厂到其实现的编译时依赖性。该类具有 setInstance(),因为它比 JDK 用于在运行时选择实现的系统属性更简单。

由于我们试图激发依赖注入(inject),因此展示一个功能齐全的工厂似乎是不公平的,即使这意味着不忠于原始的 GoF 模式。

关于java - 对这个工厂感到困惑,因为它看起来既不像抽象工厂也不像工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2904290/

相关文章:

java.lang.NoClassDefFoundError : javax/servlet/http/HttpServletRequest

design-patterns - 责任链模式

android - 如何在 ViewPager 中构建嵌套 fragment ?

java - Spring webflow booking-faces 项目中 import.sql 的名称是否重要

java - 安卓8(API 26): "colorControlHighlight" color is coming over contents

c# - XML 存储库实现

kotlin - Dagger:lateinit 属性尚未初始化

javascript - XPCOM 中的依赖注入(inject)

Java - 使用注解自动实现服务定位器模式

java - 安卓上按住音量键?