我正在尝试运行从文本文件中读取并逐行解析的“食谱”以动态调用一系列方法。我认为在进行了相当多的谷歌搜索之后我需要实现一个工厂,但我缺乏一些关键细节。这是我最接近的例子:
http://simpleprogrammer.com/2010/08/17/pulling-out-the-switch-its-time-for-a-whooping/
下面的代码是现在的一个片段。
internal static void Run(int Thread_ID, List<StringBuilder> InstructionSet, List<double>[] Waveforms)
{
//Init
List<double>[] Register = new List<double>[10];
for (int i = 0; i < Waveforms.Length; i++) { Register[i] = new List<double>(Waveforms[i]); }
for (int i = 0; i < Register.Length; i++) { if (Register[i] == null) { Register[i] = new List<double>(); } }
//Run Recipe Steps
foreach (var item in InstructionSet)
{
Step Op = Step.Parse(item.ToString());
switch (Op.TaskName)
{
case "SimpleMovingAverage":
Register[Convert.ToInt32(Op.Args[0])] = Signal_Filters.SimpleMovingAverage(Register[Convert.ToInt32(Op.Args[1])], Convert.ToInt32(Op.Args[2]));
break;
case "RollingSteppedStdDeviation":
Register[Convert.ToInt32(Op.Args[0])] = Signal_Filters.RollingSteppedStdDeviation(Register[Convert.ToInt32(Op.Args[1])], Convert.ToInt32(Op.Args[2]), Convert.ToInt32(Op.Args[3]));
break;
//... etc. many, many methods to be called.
}
}
}
...以下是我有疑问的示例部分:
public static class MoveFactory
{
private static Dictionary<string, Func<IMove>> moveMap = new Dictionary<string, Func<IMove>>()
{
{"Up", () => { return new UpMove(); }},
{"Down", () => { return new DownMove(); }},
{"Left", () => { return new LeftMove(); }}
// ...
};
public static IMove CreateMoveFromName(string name)
{
return moveMap[name]();
}
}
我可以自动生成字典列表吗?因此,每当我添加一个实现我的工厂接口(相当于 IMove)的新类时,我不必更新我的字典或我的代码的几乎任何其他部分。也许这可以强制作为接口的一部分?
在上面的示例代码中,我没有看到它传入和传出参数。查看我的代码,我有需要逐步变异的数据......我将如何使用工厂来做到这一点。
工厂需要是线程安全的,因为我想将不同的初始数据传递给多个运行自己的配方的工作人员。