我需要基于某些值创建多个不同的对象中的一个,并建议我研究一下Factory模式。我不希望我的客户端必须决定要创建哪个对象或需要硬编码的类名,所以在进行了一些阅读之后,我想出了以下(简化的)示例:
public class ObjectA : IObject
{
}
public class ObjectA : IObject
{
}
public interface IObjectFactory
{
IObject CreateObject(ObjectCreationParameters p);
}
public abstract ObjectFactory : IObjectFactory
{
abstract IObject CreateObject(ObjectCreationParameters p);
}
public ConcreteObjectFactory : ObjectFactory
{
public IObject CreateObject(ObjectCreationParameters p)
{
IObject obj;
switch (p.Value)
{
case A:
obj = new ObjectA();
break;
case A:
obj = new ObjectB()
break;
}
return obj;
}
}以上工作,但我有点困惑,我的实现是否正确。
如果可以避免,我宁愿不像在ObjectAFactory模式中那样使用ObjectBFactory和Factory Method模式,但是,我的对象层次结构似乎与Abstract Factory模式中的对象层次结构不同。我没有一个ObjectA2或ObjectB2可以通过ConcreteObject2Factory创建。
我的实现是正确的还是我做错了什么,如果是,什么?
发布于 2013-11-30 21:28:05
是的,这是一个正确的实施。这个switch语句可能是有问题的,不是多态的,但实际上,您可以在一个优秀的代码清理簿规则G23中阅读到它:与If/G23或Switch/Case相比,您更喜欢多态性。
“一个开关”规则:对于给定类型的选择,最多只能有一个开关语句。该开关语句中的情况必须创建多态对象,以取代系统其余部分中的其他此类开关语句。
您的实现抽象了具体对象的创建,共同客户不必担心它,这就是这种设计模式的目的。例如,还可以查看维基百科条目中的封装部分。
发布于 2013-11-30 21:24:29
您真正想要看的是控制反转(IoC);这本质上是工厂模式,但它的结论是自然的。
简单地说,将所有类型注册到一个IoC容器中,然后将创建它们的任务委托给它。在一个很好的现代应用程序中,您很少创建对象(而且几乎从不显式地创建对象),并且您从不担心它们的依赖关系,这一切都是为您完成的。
在C#中,我最喜欢的IoC容器是Autofac,我已经在一个赛艇项目中使用了很长一段时间,它几乎一直在做它需要做的事情。还有其他的,但我认为这是个很好的开始。
https://stackoverflow.com/questions/20305754
复制相似问题