一尘不染

何时使用构造函数以及何时使用getInstance()方法(静态工厂方法)?

java

  1. 何时以及如何使用构造函数

    Foo bar = new Foo();
    
  2. 以及何时以及如何使用getInstance()(静态工厂方法)

    Foo bar = Foo.getInstance();
    

两者有什么区别?我一直使用构造函数,但是什么时候应该使用getInstance()呢?


阅读 255

收藏
2020-09-09

共1个答案

一尘不染

每个人似乎都专注于单例,而我认为问题实际上是关于 构造函数与静态工厂方法

这实际上是 项目1:考虑静态工厂方法,而不是 Joshua Bloch 的 Effective Java
的构造函数

项目1:考虑静态工厂方法而不是构造函数

类允许客户端获取其自身实例的通常方法是提供一个公共构造函数。每个程序员的工具箱中都应该包含另一种技术。一个类可以提供一个公共的 静态工厂方法
,该方法只是返回类实例的静态方法。这是来自的一个简单示例Boolean(原始类型的装箱原始类型 boolean)。此方法将布尔基本值转换为
Boolean对象引用:

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

请注意,静态工厂方法 与“ 设计模式” [Gamma95,p。1]中的 工厂方法 模式不同。107]。此项中描述的静态工厂方法在“
设计模式”中 没有直接等效的方法。

一个类可以向其客户端提供静态工厂方法,而不是构造方法或为构造方法提供补充。提供静态工厂方法而不是公共构造方法具有优点和缺点。

优点(引用本书):

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

缺点(仍在引用这本书):

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