在大多数工厂模式实现中,getInstance
方法通常声明为静态。工厂模式的主要优点是隐藏实现细节,但为什么getInstance()
方法需要是静态的?实例化一个新的工厂对象是一种不好的做法吗?
XYZFactory factory = new XYZFactory();
XYZObj obj = factory.getInstance(TYPE);
Vs的
XYZObj obj = XYZFactory.getInstance(TYPE);
答案 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)
因为您使用工厂来创建对象。您需要的是对象实例而不是工厂实例。所以你通常会寻找最简单,最干净的方法。
让更多的工厂实例铺设是没有用的。创建对象后,工厂实例将无用,那么为什么只有一个长期存在的实例会创建无用的工厂对象呢?