首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂模式实现

工厂模式实现
EN

Stack Overflow用户
提问于 2013-11-30 21:18:16
回答 2查看 538关注 0票数 1

我需要基于某些值创建多个不同的对象中的一个,并建议我研究一下Factory模式。我不希望我的客户端必须决定要创建哪个对象或需要硬编码的类名,所以在进行了一些阅读之后,我想出了以下(简化的)示例:

代码语言:javascript
复制
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模式中的对象层次结构不同。我没有一个ObjectA2ObjectB2可以通过ConcreteObject2Factory创建。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-30 21:28:05

是的,这是一个正确的实施。这个switch语句可能是有问题的,不是多态的,但实际上,您可以在一个优秀的代码清理簿规则G23中阅读到它:与If/G23或Switch/Case相比,您更喜欢多态性。

“一个开关”规则:对于给定类型的选择,最多只能有一个开关语句。该开关语句中的情况必须创建多态对象,以取代系统其余部分中的其他此类开关语句。

您的实现抽象了具体对象的创建,共同客户不必担心它,这就是这种设计模式的目的。例如,还可以查看维基百科条目中的封装部分。

票数 0
EN

Stack Overflow用户

发布于 2013-11-30 21:24:29

您真正想要看的是控制反转(IoC);这本质上是工厂模式,但它的结论是自然的。

简单地说,将所有类型注册到一个IoC容器中,然后将创建它们的任务委托给它。在一个很好的现代应用程序中,您很少创建对象(而且几乎从不显式地创建对象),并且您从不担心它们的依赖关系,这一切都是为您完成的。

在C#中,我最喜欢的IoC容器是Autofac,我已经在一个赛艇项目中使用了很长一段时间,它几乎一直在做它需要做的事情。还有其他的,但我认为这是个很好的开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20305754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档