工厂模式中是否禁止使用静态方法?

Is it forbidden to use static methods in factory pattern?

有人告诉我在实现工厂方法模式时使用静态方法是错误的,应该避免。因为我不是很熟悉我接受那个答案的模式。

阅读文章并深入研究后,我找不到任何支持这种说法的来源。

谁能帮我解决这个问题。我应该避免在工厂方法中使用静态关键字吗?如果是这样,它们什么时候有用?

An increasingly popular definition of factory method is: a static method of a class that returns an object of that class' type. But unlike a constructor, the actual object it returns might be an instance of a subclass.

来源:https://sourcemaking.com/design_patterns/factory_method

据我所知,在工厂方法上使用静态是可以的。但是@Serge Ballesta* 在评论中有一个很好的观点。

有时实现 class 并不重要,因为接口指定了所有相关行为。在这些情况下,调用者不关心它是如何实现的,静态工厂方法就可以了。例如 Collections.emptyList()singletonSet(item) 都可以。

但有时,相同的实现不一定能满足所有 调用者的需要。这是通常的情况,即使只有测试或暂存环境才需要特殊实现。在这些情况下,调用方的正常运行 取决于 实现选择,静态工厂方法违反了依赖倒置原则。

如果相同的实现不一定适用于所有用途,那么您应该注入一个非静态工厂,这样调用者就不会与特定的实现选择耦合。

首先要百分百清楚的是,没有一个"Factory Pattern"。术语 Factory 描述了一类具有截然不同实现的模式。当有人说 Factory Pattern 时,他们可能在谈论任何创建模式;但最常见的短语 Factory Pattern 表示对设计模式一无所知。

著名的四人帮一书中发布了两个非常具体的工厂模式:Abstract Factory and Factory Method

Static Factory 由 Joshua Bloch 在 Effective Java 中推广。 Bloch 的静态工厂方法和 GoF 的工厂方法之间没有 关系,只是名称相似。

到时候我会调整原问题,给出一个明确的答案。

Is it forbidden to use static methods in the GoF Factory Method pattern?

是的。 GoF 模式需要继承,static 方法不支持。这并没有降低静态工厂模式的用处!静态工厂是一种完全合法的设计模式,恰好以与 GoF 工厂方法模式截然不同的方式实现。您可以在适当的时候使用这两种模式;现在你也可以给它们贴上适当的标签了。