gpt4 book ai didi

c# - 工厂应该有带参数的构造函数吗?

转载 作者:太空狗 更新时间:2023-10-29 23:31:47 27 4
gpt4 key购买 nike

假设我想构建一个字符串列表(这不是真实的场景案例,但听起来更容易解释)。

我的字符串列表工厂有一个接口(interface),看起来像这样

public interface IStringsListFactory{
List<string> Create();
}

但是假设我的一个具体工厂需要从文件/数据库等中获取这个字符串列表。

public class StringsListFromFile : IStringsListFactory{

private StreamReader _streamReader;
public StringsListFromFile(StreamReader sr) //StreamReader is just an example.
{
_streamReader = sr;
}

public List<string> Create(){
///recover the strings using my stream reader...
}
}

我知道这种方法行得通,但我想知道它是否破坏了工厂模式以将参数传递给工厂的构造函数,这样我就不会破坏我的接口(interface)。有没有同行可以这样做?还有其他我没有想到的解决方案吗?我是不是问的太多了!?! (是的,我知道这个问题的答案!)

最佳答案

构造函数中的参数,以及构造函数本身,应该只做一项且只有一项工作:那就是注册依赖项。有时,需要将依赖项“注入(inject)”到工厂,如 Mark Seeman 在 this answer 中的抽象工厂模式中所述。 .

public class ProfileRepositoryFactory : IProfileRepositoryFactory
{
private readonly IProfileRepository aRepository;
private readonly IProfileRepository bRepository;

public ProfileRepositoryFactory(IProfileRepository aRepository,
IProfileRepository bRepository)
{
if(aRepository == null)
{
throw new ArgumentNullException("aRepository");
}
if(bRepository == null)
{
throw new ArgumentNullException("bRepository");
}

this.aRepository = aRepository;
this.bRepository = bRepository;
}

public IProfileRepository Create(string profileType)
{
if(profileType == "A")
{
return this.aRepository;
}
if(profileType == "B")
{
return this.bRepository;
}

// and so on...
}
}

它在那种情况下有效,但在您的情况下无效,因为:

  1. 它让你的工厂有状态
  2. 如果将参数(流)作为方法参数注入(inject),它会使您的工厂更加灵活

    public class StringsListFromFile : IStringsListFactory{

    public List<string> Create(StreamReader sr){
    ///recover the strings using my stream reader...
    }
    }
  3. 如果您的界面对于输入应该是灵活的,请改用泛型

  4. 此外,最好返回IEnumerable<string>而不是 List<string>

关于c# - 工厂应该有带参数的构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19238303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com