3 回答

TA貢獻1735條經驗 獲得超5個贊
這是與您的第三種方法非常相似的東西:將工廠聲明為的內部類T,以及 makeT的構造函數private:
public class T {
public class Factory {
public T GetT() {
return new T(); // simple implementation just for an example here
}
}
private T() {}
}
由于Factory是 inside T,它可以訪問私有構造函數,但外部代碼不能。如果您不想創建單獨的程序集,可以考慮這種方法。
請注意,您仍然可以將工廠類和放在T兩個不同的文件中,其中包含partial類:
public partial class T {
private T() {}
// other stuff about T here...
}
// in another file
public partial class T {
public class Factory {
public T GetT() {
return new T();
}
// other stuff about Factory here...
}
}

TA貢獻1757條經驗 獲得超8個贊
public abstract class T { }
public class TFactory
{
public T CreateT() => new TImpl();
private class TImpl : T { }
}

TA貢獻1906條經驗 獲得超3個贊
第二種方法是最糟糕的。這種行為對客戶來說是絕對不明顯和不清楚的。堆棧跟蹤還會減慢執行速度。第一個和第二個是有道理的。
如果您想完全控制實例創建,請將其放入類型中。使用工廠方法。請記住,在對實例創建施加約束時應該是合理的。例如,實例應該使用多態(虛擬)方法啟動。不能從構造函數中調用這樣的方法(一種非常糟糕的做法),因此應該在構造之后調用該方法。為了不把這個責任推給客戶,隱藏一個構造函數并提供一個工廠方法。
abstract class Base
{
protected abstract void Initialize();
}
class Derived : Base
{
protected Derived() { /* ... */}
protected override void Initialize() { /* ... */}
public Derived CreateDerived()
{
var derived = new Derived();
derived.Initialize();
return derived;
}
}
- 3 回答
- 0 關注
- 150 瀏覽
添加回答
舉報