我需要根据某些值创建许多不同对象中的一个,建议我查看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
。
我的实施是正确的还是我做错了什么,如果是的话,是什么?
答案 0 :(得分:0)
你真正想要看的是控制反转(IoC);这基本上是工厂模式,但却得出了自然的结论。
只需将您的所有类型注册到IoC容器中,然后将创建它们的任务委托给它。在一个漂亮的现代应用程序中,你不经常创建对象(几乎从不明确地),你从不了解它们的依赖关系,这一切都为你完成。
在C#中,我最喜欢的IoC容器是Autofac我在划船项目中已经使用了很长一段时间,它几乎只是继续做它需要做的事情。还有其他人,但我认为这是一个很好的起点。
答案 1 :(得分:0)
是的,这是一个正确的实施。这个switch
语句似乎有问题且非多态,但实际上,你可以用优秀的Code Clean book来阅读它,规则 G23:喜欢将多态性转换为If / Else或Switch / Case :
“ONE SWITCH”规则:可能只有一个switch语句 给定类型的选择。 switch语句中的case必须是 创建取代其他此类切换的多态对象 系统其他部分的陈述。
您的实现抽象出具体对象的创建,客户端不必担心它,这就是这种设计模式的用途。例如,还可以查看Wikipedia entry中的封装部分。