工厂方法实现之间有什么区别?

问题描述 投票:1回答:1

GoF书中指出,有两种方法可以实现Factory Method:

应用工厂方法模式时请考虑以下问题:

  1. 两个主要品种。当Creator类为抽象类时,Factory Method模式的两个主要变体是这种情况类,并且不提供其工厂方法的实现声明,以及造物主是具体班级和提供了工厂方法的默认实现。这也是可能有一个定义默认值的抽象类实施,但这并不常见。第一种情况要求子类来定义实现,因为没有合理的选择默认。它避免了必须实例化的困境不可预见的类。在第二种情况下,具体的创建者使用工厂方法主要是为了灵活性。遵守规则表示“在单独的操作中创建对象,以便子类可以覆盖它们的创建方式。”该规则确保子类的设计者可以更改其父对象的类类在必要时实例化。
  2. 参数化工厂方法。模式的另一个变体使工厂方法可以创建多种产品。该工厂方法采用一个参数来标识要创建的对象的类型。工厂方法创建的所有对象将共享产品接口。在文档示例中,应用程序可能支持不同种类的文件。您额外传递了CreateDocument参数来指定要创建的文档的类型。

设计模式(设计模式:可重用的面向对象软件的元素)

在什么情况下,我应该使用一种方法代替另一种方法。当我更喜欢一种方法而不是另一种方法时,优点和缺点是什么?

提前感谢。

oop design-patterns factory factory-pattern
1个回答
1
投票

阅读本书的荣誉。实际上,大多数人尝试#2认为是工厂方法模式,而实际上#1声称描述了两个[主要]品种。]因此,实际上我们处理的是引号文字中模式的三个略有不同的版本,尽管其中只有两个被编号。这些版本之间的差异基于Creator拥有多少有关所需Product实现的信息。

带有[[抽象]]的Creator,工厂方法对Product实现一无所知,并将所有内容留给ConcreteCreator

    带有[[default]]的Creator的工厂方法在大多数时候(但并非总是)知道它想要的Product实现;因此它允许ConcreteCreator覆盖默认值。
  1. 带有[参数化]的Creator,工厂方法具有从Product实现中选择的菜单,并决定向ConcreteCreator询问哪个。因此,在每个连续的版本中,Creator逐渐具有有关Product实现的更多信息,以及有关如何选择实现的更多逻辑。
  2. 在“工厂方法”模式中,Creator将创建对象的责任委托给其子类,因为它“ 无法预期它必须创建的对象的类。”(第108页)基于不同品种,我们可以看到当Creator可以预期
  3. some
  4. 有关要创建的对象类别的信息时,模式将如何稍微变化。您选择的版本取决于您在编译时对Product实现的了解程度。
© www.soinside.com 2019 - 2024. All rights reserved.