我的看法:你的 「不雅」 的方式是好的。它很簡單,可讀並且完成這項工作。
列有矩形,圓形和三角形通過 IHasModelInput實施必要的工廠函數會工作,但它有一個設計成本:現在你已經加上這組類與IModelInput組類(美孚,酒吧和BAR2)。他們可能在兩個完全不同的圖書館,也許他們不應該彼此瞭解。
更復雜的方法如下。它爲您提供了在運行時配置工廠邏輯的優勢。
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;
}
但是後來問一個問題:你寧願看哪一個?
我同意耦合矩形,圓形等設置的類模型輸入是沒有那麼大。在這些情況下,我通常只是輸入輸入類型的字典來輸出類型,並使用Activator.CreateInstance。 – 2008-10-28 04:10:30