GoF书中指出,有两种方法可以实现Factory Method:
应用工厂方法模式时请考虑以下问题:
- 两个主要品种。当Creator类为抽象类时,Factory Method模式的两个主要变体是这种情况类,并且不提供其工厂方法的实现声明,以及造物主是具体班级和提供了工厂方法的默认实现。这也是可能有一个定义默认值的抽象类实施,但这并不常见。第一种情况要求子类来定义实现,因为没有合理的选择默认。它避免了必须实例化的困境不可预见的类。在第二种情况下,具体的创建者使用工厂方法主要是为了灵活性。遵守规则表示“在单独的操作中创建对象,以便子类可以覆盖它们的创建方式。”该规则确保子类的设计者可以更改其父对象的类类在必要时实例化。
- 参数化工厂方法。模式的另一个变体使工厂方法可以创建多种产品。该工厂方法采用一个参数来标识要创建的对象的类型。工厂方法创建的所有对象将共享产品接口。在文档示例中,应用程序可能支持不同种类的文件。您额外传递了CreateDocument参数来指定要创建的文档的类型。
设计模式(设计模式:可重用的面向对象软件的元素)
在什么情况下,我应该使用一种方法代替另一种方法。当我更喜欢一种方法而不是另一种方法时,优点和缺点是什么?
提前感谢。
阅读本书的荣誉。实际上,大多数人尝试#2认为是工厂方法模式,而实际上#1声称描述了两个[主要]品种。]因此,实际上我们处理的是引号文字中模式的三个略有不同的版本,尽管其中只有两个被编号。这些版本之间的差异基于 带有[[抽象]]的Creator
拥有多少有关所需Product
实现的信息。Creator
,工厂方法对Product
实现一无所知,并将所有内容留给ConcreteCreator
。
Creator
的工厂方法在大多数时候(但并非总是)知道它想要的Product
实现;因此它允许ConcreteCreator
覆盖默认值。Creator
,工厂方法具有从Product
实现中选择的菜单,并决定向ConcreteCreator
询问哪个。因此,在每个连续的版本中,Creator
逐渐具有有关Product
实现的更多信息,以及有关如何选择实现的更多逻辑。Creator
将创建对象的责任委托给其子类,因为它“ 无法预期它必须创建的对象的类。”(第108页)基于不同品种,我们可以看到当Creator
可以预期Product
实现的了解程度。