对象的创建:构造函数或静态工厂方法

我正在阅读Effective Java ,我认为这些标准的一些东西都不是本书所建议的,例如对象的创建,我的印象是构造函数是最好的方法,书籍说我们应该使用静态工厂方法,我不能少一些优点和缺点,所以我问这个问题,这是使用它的好处。

优点:

  1. 静态工厂方法的一个优点是,与构造函数不同,它们具有名称。
  2. 静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象。
  3. 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。
  4. 静态工厂方法的第四个优点是它们减少了创建参数化类型实例的详细程度。

缺点:

  1. 仅提供静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化。
  2. 静态工厂方法的第二个缺点是它们不容易与其他静态方法区分开。

参考:Effective Java,Joshua Bloch,第2版,第5-10页

我无法理解第四个优势和第二个缺点,如果有人能解释这些要点,我将不胜感激。 我还想了解如何决定是否使用构造函数或静态工厂方法来创建对象。

  • 优势4:使用构造函数时,您有

    Foo> foo = new Foo>(); 

    VS

     Foo> foo = Foo.createFoo(); // no need to repeat 

    当引入菱形语法时,这种优势将在Java 7中消失

  • 缺点2.您无法轻易判断给定的static方法是用于构造函数还是用于其他方法。

至于如何选择 – 没有单一的配方。 在给定用例的情况下,您可以权衡上述所有优点和缺点,但大多数情况下,这只是由经验驱动的决策。

如果您知道要创建的类的具体类型,那么调用构造函数就可以了。

当您不完全确定如何构造所需的对象时,静态工厂方法很好。

Factory方法仍然在具体类型上调用构造函数,但该方法处理要实例化的具体类的决定。 然后,Factory Method返回一个Interface类型(而不是具体类型),以便从调用者隐藏具体类型。

缺点2。

用于对象创建的静态方法具有与任何其他静态函数相同的function布局和外观。

只是通过查看创建对象的静态方法,您不会知道它会这样做,相反的是相关部分。 当您编写您不熟悉的代码时,可能很难识别用于创建对象的正确静态方法。

静态工厂模式的使用已有详细记录,非常有用,尤其是在Singleton和Multiton情况下。 也适用于复杂对象的初始化。