第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

工廠模式:將對(duì)象構(gòu)造限制在工廠

工廠模式:將對(duì)象構(gòu)造限制在工廠

C#
紅糖糍粑 2023-04-29 10:00:25
我有一個(gè)類T和一個(gè)TFactory創(chuàng)建類型對(duì)象的工廠T。我想確保只允許工廠創(chuàng)建新T對(duì)象。一個(gè)半心半意的解決方案是要求工廠作為T的構(gòu)造函數(shù)中的參數(shù),唯一的目的是只有至少帶來(lái)工廠對(duì)象的人才能創(chuàng)建 的T:class T{    public T(TFactory Tf)    {        if (!(Tf is TFactory))            throw new InvalidOperationException("No factory provided");    }}但是,只要 aTFactory在手邊,就可以構(gòu)造T'。另一種方法是通過(guò)堆棧跟蹤檢查構(gòu)造函數(shù)調(diào)用是否真的來(lái)自 TFactory 內(nèi)部,但這對(duì)我來(lái)說(shuō)似乎有點(diǎn)過(guò)分了。第三種方法是將 TFactoryT和 TFactory 放在它們自己的程序集中,即 makeT的構(gòu)造函數(shù)internal。但是一個(gè)新的項(xiàng)目和組裝只是為了這個(gè)目的嗎?有人有更好的主意嗎?(雖然我的代碼是C#,但這可能是一個(gè)更籠統(tǒng)的問(wèn)題)
查看完整描述

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...

    }   

}


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
陪伴而非守候

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 { }

}


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
一只名叫tom的貓

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;

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-04-29
  • 3 回答
  • 0 關(guān)注
  • 163 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)