【问题标题】:Abstract Factory vs Factory Method (scope)抽象工厂与工厂方法(范围)
【发布时间】:2012-07-03 02:15:40
【问题描述】:

工厂方法是类设计模式。抽象工厂使用许多工厂方法。为什么抽象工厂是对象设计模式,而不是类设计模式?抽象工厂将实例化推迟到哪个对象?

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

    抽象工厂模式将产品对象的创建推迟到 ConcreteFactory 子类。由于客户端期望 Factory 类(它是 ConcreteFactory 子类的父类)作为方法参数;基于传递的 ConcreteFactory 实例,创建相应的产品实例。因此,Abstract Factory 通过在运行时传递的 ConcreteFactory 实例上调用工厂方法来创建产品实例。因此,这是对象设计模式。通常这些混凝土工厂是单例的。

    不过,工厂方法发生在类级别。必须创建一个新的 ConcreteFactory 类来实例化一个 ConcreteProduct。这个 ConcreteFactory 扩展了 Factory 类,该类具有返回 Product 的 create() 方法。 ConcreteFactory 覆盖了 Factory 父类中定义的 create() 方法。

    发表评论:

    是的,工厂方法是参数化的,但在 AbstractFactory 中,您将能够调用传递的 ConcreteFactory 上的方法,从而使您能够在运行时切换到不同的 ConcreteFactory。但是在 Factory 中,由于 create() 是该类的一部分,因此如果您想创建具体产品,则必须创建 ConcreteFactory,它扩展了父 Factory 类。

    【讨论】:

    • 感谢您的回答。但是我觉得Factory方法也是参数化的,它的create()方法也是在运行时调用的。我怎么了?请多解释。
    • 这个问题我理解的比较清楚。我可以问你一个问题?好的,我的问题是:为什么我不能在运行时在 Factory 方法中切换 ConcreteFactory?如果我创建了一些 ConcreteFactory 并将 Factory 类型传递给方法,那么我可以在运行时切换 ConcreteFactory。
    • @BoodCarley - 我会尝试回答您的问题,但让我们退后一步。应用这些模式的动机是不同的。在 AbstractFactory 中,您希望能够创建多个产品系列,但在 Factory 中,您为子类(具体工厂)提供挂钩,以便能够创建 ConcreteProduct。
    • 我知道这是一个旧的问答,但我想问一个类似的问题,这个答案并没有完全解释给我。在这两种模式中,在 runtime 必须创建一个 ConcreteFactory objectinstance,并且可以作为抽象基类传递并在不需要的情况下使用在编译时知道创建了哪个 ConcreteFactory。那么为什么一个是“类”模式而另一个是“对象”模式呢?
    猜你喜欢
    • 2014-01-14
    • 2011-01-05
    • 2011-05-11
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多