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

kal*_*kal 20 java

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

如果你有

 class A {

     public static A getInstance() {
        return new A();
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*tos 22

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

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

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


Pri*_*ine 18

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

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

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)
Run Code Online (Sandbox Code Playgroud)

或者另一个例子是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;
    }

}
Run Code Online (Sandbox Code Playgroud)

工厂方法模式维基百科