Java 为什么工厂模式中的getInstance()方法应该是静态的?

Java 为什么工厂模式中的getInstance()方法应该是静态的?,java,factory-pattern,Java,Factory Pattern,在大多数工厂模式实现中,getInstance方法通常声明为静态。factory模式的主要优点是隐藏实现细节,但是为什么getInstance()方法需要是静态的呢?实例化一个新的工厂对象是一种糟糕的做法吗 XYZFactory factory = new XYZFactory(); XYZObj obj = factory.getInstance(TYPE); Vs XYZObj obj = XYZFactory.getInstance(TYPE); 许多工厂方法用于提供类本身的实例,而

在大多数工厂模式实现中,
getInstance
方法通常声明为静态。factory模式的主要优点是隐藏实现细节,但是为什么
getInstance()
方法需要是静态的呢?实例化一个新的工厂对象是一种糟糕的做法吗

XYZFactory factory = new XYZFactory(); 
XYZObj obj = factory.getInstance(TYPE);
Vs

XYZObj obj = XYZFactory.getInstance(TYPE);

许多工厂方法用于提供类本身的实例,而类不导出任何构造函数(参见示例)。如果factory方法是实例方法,那么就不会有类的对象作为开始

此外,
getInstance()
通常独立于任何现有实例,因此应将其声明为静态。如果依赖于一个,则通常首选原型(即
克隆()


最后,您应该区分工厂方法
公共静态getInstance()
抽象工厂,后者是一个通常隐藏多个接口的实现细节的类。当然,您必须能够实例化抽象工厂的子类。您可以在中找到有关创造性模式(抽象工厂、工厂方法、原型等)的详细介绍。它还提供了一个非静态工厂方法与原型混合的示例。所以你看,许多变体都是可能的…

工厂应该给你产品的实例,而不是它本身的实例。它很像Singleton。

如果工厂方法在类本身中,则它是绝对正确的。对于其他类中的工厂方法,我认为这是一个风格问题。我想回到什么时候是静态的这个基本问题:这个方法是为类作为一个整体提供行为,还是为类的特定实例提供行为?我认为工厂方法通常提供类级行为。

因为您使用工厂来创建对象。您需要的是对象实例,而不是工厂实例。所以你通常会寻找最简单、最干净的方法


有更多的工厂实例存在是没有用的。创建对象后,工厂实例将不再有用,那么为什么只创建一个长期存在的实例就可以创建无用的工厂对象呢?

Wade也是绝对正确的。我只发布了一半的答案作为第一;)现在我已经完成了,我希望它涵盖了所有的案例。。。