我被告知在实现工厂方法模式时使用静态方法是错误的,应该避免。因为我不太熟悉我接受这个答案的模式。
在阅读文章并深入研究之后,我找不到任何支持这种说法的来源。
有人可以帮我解决这种情况。我应该避免工厂方法中的静态关键字吗?如果是,它们什么时候有用?
我被告知在实现工厂方法模式时使用静态方法是错误的,应该避免。因为我不太熟悉我接受这个答案的模式。
在阅读文章并深入研究之后,我找不到任何支持这种说法的来源。
有人可以帮我解决这种情况。我应该避免工厂方法中的静态关键字吗?如果是,它们什么时候有用?
越来越流行的工厂方法定义是:一个类的静态方法,它返回该类类型的对象。但与构造函数不同,它返回的实际对象可能是子类的实例。
来源:https ://sourcemaking.com/design_patterns/factory_method
据我所知,可以在工厂方法上使用静态。但是@Serge Ballesta* 在评论中有一个很好的观点。
有时实现类并不重要,因为接口指定了所有相关的行为。在这些情况下,调用者并不关心它是如何实现的,静态工厂方法就可以了。 Collections.emptyList()
或者singletonSet(item)
,例如,很好。
但是,有时,对于所有调用者来说,相同的实现不一定是正确的 。这是通常的情况,即使仅测试或登台环境需要特殊实现。在这些情况下,调用者的正常运行取决于实现选择,而静态工厂方法违反了依赖倒置原则。
如果相同的实现不一定适用于所有用途,那么您应该注入一个非静态工厂,以便调用者不会耦合到特定的实现选择。
首先要 100% 明确的是,没有单一的“工厂模式”。工厂一词描述了一类具有截然不同的实现的模式。当有人说工厂模式时,他们可能是在谈论任何创造模式;但最常见的短语工厂模式表示对设计模式的无知。
著名的“四人帮”一书中发表了两种非常具体的工厂模式:抽象工厂和工厂方法。
静态工厂由 Joshua Bloch 在 Effective Java 中推广。Bloch 的静态工厂方法和 GoF 的工厂方法之间没有任何关系,只是名称相似。
然后,我将调整原始问题,以提供明确的答案。
GoF工厂方法模式中是否禁止使用静态方法?
是的。GoF 模式需要继承,static
方法不支持。这不会降低静态工厂模式的用处!静态工厂是一种完全合法的设计模式,它的实现方式恰好与 GoF 工厂方法模式完全不同。你可以在适当的时候使用这两种模式;现在您也可以适当地标记它们。