2011-09-05 76 views
4

作爲一名「javaland」程序員,我習慣於Factory Methods和Multiple Constructors。 我的工廠模式主要用於延遲決策,直到運行時,在實例化過程中執行某種副作用或限制或隱藏具體類型。當我深入C#時,我發現越來越多的API將多個構造函數和靜態方法混合在一起。多構造函數vs靜態創建方法

例如,XmlReaderXmlTextReaderXmlWriterXmlTextWriter

我的問題是:

  1. 是不是有什麼特殊的用Create方法或者它僅僅是一個約定(如Java:getInstance)?
  2. C#中有關工廠方法vs構造函數的最佳實踐是什麼?爲什麼,例如,有幾個Create方法可以接受XmlWriter中的XmlWriterSettings參數,並且在XmlTextWriter中沒有構造函數具有相同的用途?另一方面,爲什麼只有建設者接受Encoding的論點?
  3. 我猜主要問題是,在習慣C#中,什麼時候推薦暴露工廠方法,何時公開構造函數被暴露?
+0

,我不認爲這是特別是C#的問題是相同的 - 這是一個面向對象的問題,首要的。既然如此,那至少是[this one]的部分欺騙(http://stackoverflow.com/q/628950/27615)。 – razlebe

+0

我想我想要「慣用的c#意見」,但除此之外你是對的,這是一個通用的問題。我只是認爲來自不同語言和文化的程序員可能對此有不同的見解。 –

回答

3

1)我知道的唯一的區別是泛型類型推斷supported for methods but not for constructors。因此,你可以這樣寫:

var str = "foo"; 
var num = 42; 
var tuple = Tuple.Create(str, num); 

而如果你想使用一個構造函數(很不幸Tuple沒有公共構造函數,所以這個例子不是編譯)你會寫:

var tuple = new Tuple<string, int>(str, num); 

當然,這隻適用於泛型的構造函數,所以它不完全是主流的區別。

2)我懷疑這是一種「隨機」(如果「隨機」聽起來很刺耳,那麼讓我們說「不是以最佳實踐爲前提)」的決定,但我沒有任何數據以支持這一點。

3)工廠方法也是您可以將對象強制轉換爲其祖先類型之一的唯一方法。有時這不僅是可取的,而且也是必要的,因爲你的類型的用戶可能不知道他們應該構建什麼類型。例如,考慮返回Stream的工廠方法,該方法可能是RedStreamBlueStream,具體取決於某些輸入參數。

1

是不是有什麼特別的與創建方法或者它僅僅是一個 約定

這僅僅是如何命名的工廠方法的公約。

C#關於工廠方法的最佳實踐vs 構造函數?

有些作爲Java,請記住.net框架現在顯示它的年齡,並沒有任何東西都被刪除。所以它自身的框架並不總是顯示被認爲是當前的良好實踐。

我想主要的問題是,在地道的C#,建議使用這種 時揭露工廠方法和公共的構造函數時,應 暴露?

現在是一個很好的問題,我想答案是C# 如Java

相關問題