根据皮埃尔的评论更新:
定义一个通用转换器如下:
public interface IVideoConverter
{
IInputReader Reader {get;set;}
IOutputWriter Writer {get;set;}
void Convert();
}
定义接口:
public interface IInputReader
{
bool IsSUpported(string inputId);
void AppendToBuffer(Buffer buffer);
}
public interface IOutputWriter
{
bool IsSUpported(string outputId);
void WriteFromBuffer(Buffer buffer);
}
编写实现转换器的类:
public class VideoConverter : IVideoConverter
{
...
}
写3个工厂:
public class InputReaderFactory
{
public IInputReader GetReader(string inputId)
{
...
}
}
public class OutputWriterFactory
{
public IOutputWriter GetWriter(string outputId)
{
...
}
}
public class VideoConverterFactory
{
public IVideoConverter GetConverter(string inputId, string outputId)
{
...
}
}
在每个工厂中,使用您想要构建工厂负责的实例的任何方法。VideoConverterFactory 应该使用读取器和写入器工厂
有几种方法可以实现具体的类型初始化。我将描述2:
a) 创建一个静态只读数组或所有受支持类型的列表,并在此列表中搜索支持给定输入参数的第一个转换器。
public class InputReaderFactory
{
private static readonly IEnumerable<IInputReader> SupportedReaders = new IInputReader[] {new Reader1(), new Reader2(),....}
public IInputReader GetReader(string inputId)
{
for(int i=0; i<SupportedReaders .length; i++)
{
if(SupportedReaders [i].IsSupported(inputId)
return SupportedReaders [i];
}
return null;
}
}
b)在配置文件中定义支持的类型(实现配置元素,配置集合和部分),并在工厂类中从配置中搜索支持的转换器,当找到一个时,使用反射创建一个实例