亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

工廠模式:將對象構造限制在工廠

工廠模式:將對象構造限制在工廠

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

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

    }   

}


查看完整回答
反對 回復 2023-04-29
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

public abstract class T { }


public class TFactory

{

    public T CreateT() => new TImpl();


    private class TImpl : T { }

}


查看完整回答
反對 回復 2023-04-29
?
一只名叫tom的貓

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;

    }

}


查看完整回答
反對 回復 2023-04-29
  • 3 回答
  • 0 關注
  • 150 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號