簡體   English   中英

有關工廠模式的設計問題

[英]Design question regarding Factory Pattern

我想將IGameScoreSource類型IGameScoreSource到一個類中,但是我很IGameScoreSource如何進行處理。

static class GamesScoreSourceFactory
{
    public IGameScoreSource GetGameScoreSource(GameScoreSourceType gameScoreSourceType)
    {
        switch(gameScoreSourceType)
        {
            case FromFile:
                return new GameScoreFile();
            case FromDB:
                return new DatabaseRepos();
            case FromThirdPartyAPI:
                return new ThirdPartyWrapper();
        }   
    }
}

對於兩個不同的場景,我有兩個問題。

所有這三種情況都神奇地找出了從何處獲取參數。 因此,對於GameScoreFile它知道要查看的文件路徑,對於DatabaseRepos它知道在哪里可以找到連接字符串。

大概這些位置在具體類中是硬編碼的。 但是,如果我想更改位置怎么辦? 假設將scores.txt硬編碼在GameScoreFile.cs ,如果我想要rand_scores.txt怎么rand_scores.txt

所以:

 static class GamesScoreSourceFactory
    {
        public IGameScoreSource GetGameScoreSource(GameScoreSourceType gameScoreSourceType, string param)
        {
            switch(gameScoreSourceType)
            {
                case FromFile:
                    return new GameScoreFile(string param);
                case FromDB:
                    return new DatabaseRepos(string param);
                case FromThirdPartyAPI:
                    return new ThirdPartyWrapper(ThirdPartyConfig conf{IPAddress = ipAddress, Port = port});
            }   
        }
    }

前兩種情況很好,但第三種情況不好,因為它需要一個config對象。

我必須創建另一個工廠類嗎? 但是調用代碼不必知道要調用哪個Factory對象,結果本身就變成了Factory?

我不確定如何處理...如果重復,請鏈接我。

理想情況下,您將以下類型作為對工廠類的依賴項注入

GameScoreFile
DatabaseRepos
ThirdPartyWrapper

這樣,無論您用於依賴關系解析的哪個框架都知道要傳遞對應類型的內容。

我會嘗試隔離依賴項,以使工廠類不必了解太多。

假設您的IGameScoreSource的每個具體實現都有自己的依賴性。 在上面的示例中,兩個需要一個字符串,而第三個則需要ThirdPartyConfig。

這看起來並不多,但是隨着您逐步重構類,每次引入或更改依賴項時,工廠類也必須進行更改。 不理想。

您可以為每種具體類型創建一個工廠,然后對其中一種實現的任何更改只會影響其自己的工廠。 然后,主要工廠類將僅與這些特定工​​廠一起使用,而不受每次更改的影響。

正確的解決方案取決於您的域模型和所使用的IOC方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM