工厂模式实施

时间:2013-11-30 21:18:17

标签: c# design-patterns factory-pattern

我需要根据某些值创建许多不同对象中的一个,建议我查看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模式中那样ObjectBFactoryFactory Method,但是,我的对象层次结构似乎不遵循相同的对象层次结构,如Abstract Factory模式的示例。我没有通过ObjectA2创建的ObjectB2ConcreteObject2Factory

我的实施是正确的还是我做错了什么,如果是的话,是什么?

2 个答案:

答案 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中的封装部分。