我正在研究 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/