私の意見: あなたの「洗練されていない」方法は問題ありません。シンプルで読みやすく、仕事をします。
Rectangle、Circle、および Triangle にIHasModelInputを介して必要なファクトリ関数を実装させることは機能しますが、設計コストがかかります。これで、このクラスのセットを IModelInput クラスのセット (Foo、Bar、および Bar2) と結合しました。それらは 2 つの完全に異なるライブラリに存在する可能性があり、お互いを認識すべきではない可能性があります。
より複雑な方法を以下に示します。実行時にファクトリ ロジックを構成できるという利点があります。
public static class FactoryMethod<T> where T : IModelInput, new()
{
public static IModelInput Create()
{
return new T();
}
}
delegate IModelInput ModelInputCreateFunction();
IModelInput CreateIModelInput(object item)
{
Dictionary<Type, ModelInputCreateFunction> factory = new Dictionary<Type, ModelInputCreateFunction>();
factory.Add(typeof(Rectangle), FactoryMethod<Foo>.Create);
factory.Add(typeof(Circle), FactoryMethod<Bar>.Create);
// Add more type mappings here
IModelInput modelInput;
foreach (Type t in factory.Keys)
{
if ( item.GetType().IsSubclassOf(t) || item.GetType().Equals(t))
{
modelInput = factory[t].Invoke();
break;
}
}
return modelInput;
}
しかし、次の質問をしてください。どちらを読みたいですか?