我的意见:你的“不优雅”的方式很好。它简单,易读并且可以完成工作。
让 Rectangle、Circle 和 Triangle 通过IHasModelInput实现必要的工厂函数是可行的,但它有设计成本:您现在已经将这组类与 IModelInput 类集(Foo、Bar 和 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;
}
但接着问一个问题:你更愿意读哪一本?