有关工厂模式的设计问题

时间:2019-03-01 05:32:41

标签: c# design-patterns factory

我想将类型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怎么办?

所以:

 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});
            }   
        }
    }

前两种情况都很好,但第三种情况不是,因为它需要一个配置对象。

我必须创建另一个工厂类吗?但是调用代码不必知道要调用哪个Factory对象,结果本身就变成了Factory?

我不确定如何处理...如果重复,请链接我。

2 个答案:

答案 0 :(得分:0)

理想情况下,您将以下类型作为对工厂类的依赖项注入

GameScoreFile
DatabaseRepos
ThirdPartyWrapper

这样,无论您使用哪种框架进行依赖性解析,都知道要为对应的类型传递什么。

答案 1 :(得分:0)

我将尝试隔离依赖项,以使工厂类不必了解太多。

比方说,您IGameScoreSource的每个具体实现都有自己的依赖性。在上面的示例中,两个需要一个字符串,而第三个需要ThirdPartyConfig。

这看起来并不多,但是随着您重新构造类,每次引入或更改依赖项时,工厂类也必须进行更改。不理想。

您可以为每种具体类型创建工厂,然后对其中一种实现的任何更改只会影响其自己的工厂。然后,主要工厂类将仅与这些特定工​​厂一起使用,而不受每次更改的影响。

正确的解决方案取决于您的域模型和所使用的IOC方法。