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

时间:2010-10-27 02:47:11

标签: java

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

如果你有

 class A {

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

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

3 个答案:

答案 0 :(得分:22)

请参阅here,了解您可能想要执行此操作的主要原因。总结:

  1. 被命名为“建设者”。
  2. 如果合适,可以返回null。
  3. 如果合适,可以返回派生类的实例。
  4. 在实例化泛型类型的变量时减少冗长。
  5. 另一个原因是文章没有提到:可以实现有趣的逻辑,以避免一直创建新对象(基于参数,回收等的缓存)。

答案 1 :(得分: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)

或者另一个例子是 Singleton Pattern 。在那里你不能只提供一个实例。所以这就是你将构造函数设为私有并创建一个自己的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;
    }

}

Factory Method Pattern Wikipedia

答案 2 :(得分:2)

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