如何使用“静态工厂方法”而不是构造函数?

有效的java说“考虑提供静态工厂方法而不是构造函数”

如果你有

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

为A类提供此方法是否有意义,而不是在代码中调用new A()。

请参阅此处,了解您可能想要执行此操作的主要原因。 综上所述:

  1. 被命名为“建设者”。
  2. 如果合适,可以返回null。
  3. 如果合适,可以返回派生类的实例。
  4. 在实例化generics类型的变量时减少冗长。

另一个原因让人联想到文章没有提到:可以实现有趣的逻辑以避免一直创建新对象(基于参数的缓存,回收等)。

对于上面的示例,提供静态构造函数没有多大意义。 通常,当您提供静态构造函数时,您应该将普通构造函数设为私有。 否则,仍然可以使用普通构造函数创建实例。

当你可以使用静态工厂方法时,我试着用另一个例子解释这里。 其中一个优点是,您可以为工厂方法提供可理解的名称。

 class Complex { public static Complex fromCartesian(double real, double imag) { return new Complex(real, imag); } public static Complex fromPolar(double modulus, double angle) { return new Complex(modulus * cos(angle), modulus * sin(angle)); } private Complex(double a, double b) { //... } } Complex c = Complex.fromPolar(1, pi) 

或者另一个例子是Singleton模式 。 在那里你不能只提供一个实例。 因此,这就是为什么你将构造函数设为私有并创建一个自己的getInstance方法的原因,你确保只有一个实例可用。

 public class Singleton { private volatile static Singleton singleton; private Singleton() { } // synchronized keyword has been removed from here public static Singleton getSingleton() { if(singleton==null) { synchronized(Singleton.class){ if(singleton == null) { singleton = new Singleton(); } } } return singleton; } } 

工厂方法模式维基百科

如果你在寻找单个实例,那么使用静态方法调用的Singleton模式是更好的设计..因为静态的可重入锁定性质…提供线程安全性并且还避免无序写入。