繁体   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