代码之家  ›  专栏  ›  技术社区  ›  John Bustos

C#通用工厂模式,不说明通用工厂模式的类型

  •  0
  • John Bustos  · 技术社区  · 6 年前

    我正在从事一个C#项目,以解析不同类型的文件。为此,我创建了以下类型的类结构:

    interface FileType {}
        class FileType1 : FileType {}
        class FileType2 : FileType {}
    
    abstract class FileProcessor<T> {}
        class Processor_FileType1 : FileProcessor<FileType1> {} 
        class Processor_FileType2 : FileProcessor<FileType2> {} 
    

    现在,我想创建一个工厂模式,它只需要获取文件的路径 根据文件的内容决定实例化2个处理器中的哪一个

    理想情况下(我知道这段代码不起作用),我希望我的代码看起来如下:

    class ProcessorFactory
    {
        public FileProcessor Create(string pathToFile)
        {
            using (var sr = pathToFile.OpenText())
            {
                var firstLine = sr.ReadLine().ToUpper();
    
                if (firstLine.Contains("FIELD_A"))
                    return new Processor_FileType1();
    
                if (firstLine.Contains("FIELD_Y"))
                    return new Processor_FileType2();
            }
        }
    }
    

    问题是编译器错误 Using the generic type 'FileProcessor<T>' requires 1 type arguments 因此,我的程序可以执行以下操作:

    public DoWork()
    {
        string pathToFile = "C:/path to my file.txt";
        var processor = ProcessorFactory.Create(pathToFile);
    }
    

    以及 processor 变量wold可以是a Processor_FileType1 Processor_FileType2

    我知道我可以通过改变 Create 接受类型参数,但我希望我不必这样做,因为这会扼杀根据文件中的数据计算出来的想法。

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   John Wu    6 年前

    你很接近。您只需要在对象模型中再添加一个概念,即通用IFileProcessor。

    interface FileType {}
        class FileType1 : FileType {}
        class FileType2 : FileType {}
    
    interface IFileProcessor {}  //new
    abstract class FileProcessor<T> : IFileProcessor {}
        class Processor_FileType1 : FileProcessor<FileType1> {} 
        class Processor_FileType2 : FileProcessor<FileType2> {} 
    

    并更改您的退货类型:

    public IFileProcessor Create(string pathToFile)
    {
        //implementation
    }