2013-10-29 34 views
0

我想在Java中正確實現工廠模式。我已經這樣做了(下面的代碼),任何人都可以指出,如果這是一個「適當」的方式,或任何設計缺陷?Factory,Singleton,最佳實踐

我的想法/限制是:

  • 別的東西必須能繼承這個廠,所以我沒有選擇,使其枚舉。
  • 我做到了這家工廠一個單,以便有沒有運行其它工廠橫行
  • 我想讓它線程安全的,所以我選擇了把同步鎖self
  • 有沒有的東西一噸有在工廠去,所以性能(空間/時間)沒有太大的交易

的代碼是一樣的東西:

public class MyFactory { 
    private static MyFactory self; 

    private MyFactory() { 
     synchronized (self) { 
      if (self == null) { 
       self = new MyFactory(); 
      } 
     } 
    } 
} 

請問這一段代碼從此放棄我問題?

另一種方法是一樣的東西

public class MyFactory { 
    private static MyFactory self = new MyFactory(); 
} 

哪一個更好,什麼是這些類型的懶人VS渴望實例化的考慮?

+1

'synchronized(self)'我產生一個'NullPointerException',要麼使用另一個'static final'對象或者同步這個方法。第二個例子可以允許兩個或者多個線程創建多個工廠實例。 – MadProgrammer

+0

工廠和單身人士是兩個不同的概念,最好是將他們分開處理。你打算使用任何框架?如果是,單身人士應該是框架的責任,例如,彈簧。 – yadab

+0

@MadProgrammer等等,真的嗎?我無法同步一個構造函數(我認爲這相當於一個靜態初始化函數?) –

回答

1

一個批評是,能夠子類化要求和單例要求是不一致的 - 如果你想能夠繼承工廠,你必須使構造函數不是私有的,這使得工廠不是獨立的。

+0

工廠應該是單身人士嗎? –

+0

他們通常是肯定的,但老實說,不要讓它阻止你。如果你的實現需要稍微不同的東西,那麼就去做吧 - 只要它乾淨,易於使用和理解。模式中的標準對於保持事物的方式來說是一個很好的指導,但是如果你不在行,那麼它們並不是硬性規則,也就是沒有人會理解你的代碼的規則。 – Numeron