2012-03-16 57 views
6

阅读有效的Java,看起来使用静态工厂方法有很多优点,而且缺点很少。通过静态工厂方法我特指下列我应该总是使用静态工厂方法而不是构造函数吗?

public class MyClass {  
    private MyClass() { ... }; 

    public static MyClass getInstance() { 
    return new A(); 
    }  
} 

从有效的Java:

注意,静态工厂方法是不一样的,从设计模式[Gamma95,第Factory Method模式。 107]。这个项目中描述的静态工厂方法在设计模式中没有直接的等价物。

现在是最好总是遵循这种做法,或只有时?

如果是这样的话?

是否曾经矫枉过正呢?

+1

当它过度杀伤时它过度杀伤。只有你可以判断。一般来说,我会提醒你不要盲目追求*任何*收到的智慧。你通常会发现原始声明被对冲的所有原始资格被遗忘,只有规则依然存在,通常没有人真正知道为什么。 – EJP 2012-03-16 05:51:35

+0

在这种情况下,我们很幸运,因为原始文本在有效Java项目1中保留了其所有的荣耀。但我不确定我对此的解释是否正确。 – cendrillon 2012-03-16 06:08:31

+0

我会说它通常是过度杀伤,除非你有一个特定的原因想要隐藏正在创建的实际类型,这基本上是当你想使用工厂模式。我认为在大多数情况下并非如此。例如,如果你不能构造一个字符串或一个线程,考虑一下生活会是什么样子。 – EJP 2012-03-16 06:10:33

回答

5

一般来说,构造函数比工厂更简单,所以这是选择Factory上的构造函数的主要原因。在情况需要时使用工厂,不是“默认”。你应该做最简单的事情来解决你的问题,而且大部分时间这都是构造函数。

+2

我喜欢你的推理(奥卡姆剃刀),但是我想知道是否公开构造函数可能会在稍后回来咬。一旦公开它就不能再私有化,而没有破坏利用构造函数的现有代码的风险。这意味着稍后改装静态工厂方法可能会很痛苦。另外我想也可能有线程安全问题。我不是故意问你的答案,但我只是想知道是否还有比这更多的东西? – cendrillon 2012-03-16 06:04:36

+2

这是一种判断呼叫区域,但常见问题是开发人员倾向于过度设计他们的代码。虽然确实应该提前思考,但您应该考虑如何才能要求这样的改变。那么你必须做出判断电话。总的来说,我还是会说简单就好。这实际上是YAGNI的一个论据:http://en.wikipedia.org/wiki/You_ain't_gonna_need_it – Oleksi 2012-03-16 06:07:21

+1

这是一个很好的观点。我想知道如何平衡一方面避免过度设计和良好的封装,即最大限度地减少类和成员的可访问性?也就是说,构造函数总是可以公开的,但一旦公开它就必须公开,直到时间结束。 – cendrillon 2012-03-16 06:19:18

2

工厂方法使用该对象从代码中提取对象的创建和配置

如果都取决于创建和初始化对象的复杂性。如果它们很简单,则不需要使用工厂模式。

如果它有点复杂(在使用它之前在初始化过程中涉及很多步骤),最好使用工厂模式。

相关问题