テキストファイルから読み取った「レシピ」を実行し、行ごとに解析して、一連のメソッドを動的に呼び出そうとしています。かなりのグーグルを行った後、ファクトリを実装する必要があると思いますが、いくつかの重要な詳細が不足しています。これは私が持っている最も近い例です:
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に相当)を実装する新しいクラスを追加するたびに、辞書やコードの他の部分を更新する必要はありません。おそらく、これはインターフェイスの一部として強制される可能性がありますか?
上記のサンプルコードでは、引数を出し入れしているのがわかりません。コードを見ると、段階的に変更する必要のあるデータがあります...ファクトリを使用してこれを行うにはどうすればよいですか。
それぞれが独自のレシピを実行している複数のワーカーに異なる初期データを渡したいので、ファクトリはスレッドセーフである必要があります。