为什么Factory模式中的getInstance()方法是静态的?

时间:2011-09-12 20:36:46

标签: java factory-pattern

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

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

Vs的

XYZObj obj = XYZFactory.getInstance(TYPE);

4 个答案:

答案 0 :(得分:9)

许多工厂方法用于提供类本身的实例,而不会导出类导出任何构造函数(请参阅例如Josh Bloch item 1)。如果工厂方法是实例方法,则不会以类的对象开头。

此外,getInstance()通常独立于任何现有实例,因此应将其声明为static。如果它取决于一个,则通常首选原型(即clone())。

最后,您应该区分工厂方法public static getInstance()抽象工厂,这是一个经常为多个接口隐藏实现细节的类。当然,您必须能够实例化抽象工厂的子类。您可以在classic Design Patterns book from the Gang of Four中找到对创作模式(抽象工厂,工厂方法,原型等)的精彩介绍。它还给出了与原型混合的非静态工厂方法的示例。所以你看,很多变种都是可能的......

答案 1 :(得分:3)

如果工厂方法在类本身中,则

Daves answer绝对正确。对于其他类的工厂方法,我认为这是一个风格问题。我将回到什么时候是静态的基本问题:这个方法是否为整个类或类的特定实例提供了行为?我认为工厂方法通常提供类级行为。

答案 2 :(得分:0)

工厂应该为您提供产品实例,而不是实例。它更像是辛格尔顿。

答案 3 :(得分:0)

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

让更多的工厂实例铺设是没有用的。创建对象后,工厂实例将无用,那么为什么只有一个长期存在的实例会创建无用的工厂对象呢?