在乍一看,貌似正確回答你的問題是#1。這是因爲你的班級是MyClass<T>
,因此工廠也應該是T
特定的。但還有更多的東西比這個簡單的答案。
在繼續之前,我會添加第三種可能性:非靜態工廠類。依賴於工廠的對象會擁有一個公共屬性,通過它可以接收工廠對象。如果沒有其他實例被分配,屬性的Getter將實例化默認工廠。這允許以後依賴注入,並且還有助於編寫依賴於他們自己的假工廠的單元測試。解決方案會是這個樣子(忽略了片刻仿製藥):
public class ISomeFactory { ... }
public class DefaultSomeFactory: ISomeFactory { ... }
public class ClientClass
{
public ISomeFactory FactoryOfSome // Right place for dependency injection
{
get
{
if (_fact == null)
_fact = new DefaultFactory();
return _fact;
}
set { _fact = value; }
}
private ISomeFactory _fact;
}
現在,就像我說的,你們班去與通用參數MyClass<T>
然後工廠應與泛型參數去還有:Factory<T>
。這個解決方案比一般工廠的通用方法更好,只是因爲創建一個實例可能是特定於T
。與一般的工廠解決方案可以讓你:
public class SpecialSomeFactory: DefaultSomeFactory<string> { ... }
通過這種方式,可以覆蓋現有的工廠類的行爲,並以另一種方式產生的特殊字符串實例。這很重要,因爲處理字符串通常與處理諸如int或double的基本類型大不相同。有機會專業化工廠可能是有益的。但是現在你明白爲什麼有一個靜態工廠可能是一個壞主意 - 靜態不能被擴展。
我認爲這個問題是一個很好的人選[你最有爭議的編程觀點是什麼?](http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming-opinion),但只適用於C#語言 –