如何使用“静态工厂方法”而不是构造函数?
有效的java说“考虑提供静态工厂方法而不是构造函数”
如果你有
class A { public static A getInstance() { return new A(); } }
为A类提供此方法是否有意义,而不是在代码中调用new A()。
请参阅此处,了解您可能想要执行此操作的主要原因。 综上所述:
- 被命名为“建设者”。
- 如果合适,可以返回null。
- 如果合适,可以返回派生类的实例。
- 在实例化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模式是更好的设计..因为静态的可重入锁定性质…提供线程安全性并且还避免无序写入。