3 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是與您的第三種方法非常相似的東西:將工廠聲明為的內(nèi)部類T,以及 makeT的構(gòu)造函數(shù)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,它可以訪問(wèn)私有構(gòu)造函數(shù),但外部代碼不能。如果您不想創(chuàng)建單獨(dú)的程序集,可以考慮這種方法。
請(qǐng)注意,您仍然可以將工廠類和放在T兩個(gè)不同的文件中,其中包含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貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
public abstract class T { }
public class TFactory
{
public T CreateT() => new TImpl();
private class TImpl : T { }
}

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
第二種方法是最糟糕的。這種行為對(duì)客戶來(lái)說(shuō)是絕對(duì)不明顯和不清楚的。堆棧跟蹤還會(huì)減慢執(zhí)行速度。第一個(gè)和第二個(gè)是有道理的。
如果您想完全控制實(shí)例創(chuàng)建,請(qǐng)將其放入類型中。使用工廠方法。請(qǐng)記住,在對(duì)實(shí)例創(chuàng)建施加約束時(shí)應(yīng)該是合理的。例如,實(shí)例應(yīng)該使用多態(tài)(虛擬)方法啟動(dòng)。不能從構(gòu)造函數(shù)中調(diào)用這樣的方法(一種非常糟糕的做法),因此應(yīng)該在構(gòu)造之后調(diào)用該方法。為了不把這個(gè)責(zé)任推給客戶,隱藏一個(gè)構(gòu)造函數(shù)并提供一個(gè)工廠方法。
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 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)