【发布时间】:2012-03-27 00:47:27
【问题描述】:
我一直在阅读 Joshua Bloch 的Effective Java,到目前为止它确实名副其实。第一项为 静态工厂方法 优于 构造函数 提供了一个令人信服的案例。以至于我开始质疑优秀的旧构造函数的有效性:)。
本书的优缺点总结如下:
优点:
- 他们有名字!
- 我们拥有完全的实例控制(单例、性能等)
- 它们可以返回子类型/接口
- 编译器可以提供类型推断
缺点:
- 不能对私有类进行子类化
- 它们不像构造函数那样在文档中脱颖而出
第一个缺点实际上可能是一件好事(如书中所述)。第二个,我认为只是一个小缺点,可以通过即将发布的 java 版本轻松解决(javadoc 等的注释)
看起来,最终工厂方法几乎具有构造函数的所有优点,还有很多优点,而没有真正的缺点!
所以,我的问题基本上分为三个部分:
- 默认情况下始终使用静态工厂方法而不是构造函数是一种好习惯吗?
- 使用构造函数是否合理?
- 为什么面向对象语言不为工厂提供语言级别的支持?
注意:有两个类似的问题:When to use a Constructor and when to use getInstance() method (static factory methods)? 和 Creation of Objects: Constructors or Static Factory Methods。然而,答案要么只是提供上述列表,要么重申我已经知道的静态工厂方法背后的基本原理。
【问题讨论】:
-
另外,根据this,显然工厂在线程安全方面甚至比构造函数更有优势。
-
我阅读了所引用的文章,但得出了与作者相反的结论... :-) 我明白所指出的内容,但不同意。也许这与我们每个人在编码时通常会看到的特定用例有关。
-
@BrianKnoblauch,我不是并发方面的专家,所以我会相信你的话,因为这些例子似乎有些做作:)
标签: java design-patterns constructor factory-pattern effective-java