2010-10-27 85 views
18

有效的Java說 「考慮提供靜態工廠方法代替構造函數」如何使用「靜態工廠方法」而不是構造函數?

如果你有

class A { 

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

是否有意義提供A類此方法,而不是調用new A()在代碼中。

+0

可能的重複:http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java – oksayt 2010-10-27 03:39:11

+8

+1閱讀有效的Java – flash 2010-10-27 06:08:25

回答

21

查看here您可能想要這樣做的主要原因的一個很好的闡述。總結:

  1. 命名爲「構造函數」。
  2. 如果適用,可以返回null。
  3. 如果適用,可以返回派生類的實例。
  4. 在實例化泛型類型的變量時減少冗長。

另一個讓我們想到的原因是文章沒有提到:可以實現有趣的邏輯以避免始終創建新對象(基於參數的緩存,回收等)。

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模式。你不能只提供一個實例。因此,這就是爲什麼您將構造函數設置爲private並創建自己的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

與靜態方法調用的Singleton模式是一個更好的設計,如果烏拉圭回合尋找單個實例..因爲折返鎖定的靜態特性..的提供線程安全,也避免OUT- ...

相關問題