[英]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.