简单工厂和工厂方法模式的动机

cro*_*raf 8 java oop design-patterns factory factory-pattern

我知道有很多关于不同工厂模式的差异的问题,但答案是如此不同和令人困惑.我读过的书籍使用不清楚和(简化)简化的例子.即使在阅读维基百科的解释之后,我也有很多问题,以及关于它们的大量在线解释,包括所有这些网站上的解释.我正在阅读的这本书是Head First Design Patterns.

在Simple Factory中,客户端使用单独的类(Creator)和工厂方法(可以是静态的)来返回Products.

在工厂方法模式中,创建者和客户端是相同的东西,他们在同一个类中使用抽象方法来创建新的产品,它们在同一个类中运行.当然,造物主(或客户)是抽象的,因此关于制作混凝土产品的决定被推迟到子类.

  1. 我的理解是否正确(例如,FMP中的客户端和创建者是同一件事,我从未在FMP图中看到客户端)?

  2. 在Factory Method Pattern中,它表明create方法不能在Creator之外重用,所以它只能在创建一个新的Creator时重用?

  3. 在哪种情况下我可以选择一个而不是另一个?

(PS请不要将此标记为重复,我希望在此网站上明确这一点)

em_*_*_ma 6

Simple Factory是一个班级形式的工厂.因此,它无法解决优雅问题,因为对于Product的每个新子类,您都必须在create()方法中编辑switch语句.这违反了开/关原则.使简单工厂变得有用的一种潜在方法是使用如下所示的类注册:http://www.oodesign.com/factory-pattern.html

工厂方法是一个工厂中的形式的方法(因此而得名).这不违反打开/关闭原则,因为您通过扩展而不是通过修改代码来处理更改.

你的理解是正确的.FMP中的客户端和创建者/工厂是相同的,因为工厂(方法)是客户端的一部分.

确实,FMP中的create方法不可重用.这是可以的,因为这不是尝试创建应用程序范围的产品工厂,而是客户端创建他的依赖对象而不使用新的方法.

我不能回答你的第三个问题,因为我认为这是基于偏好.


Old*_*eon 2

您看到的是两种工厂方法风格的示例,因为有两种完全不同的情况适合它们。

第一种类型——这似乎与您所谓的简单工厂相一致,当您有一个相对复杂的对象,并且由于其复杂性而很难创建时,就会出现这种情况。

这里的经典示例是Pizza具有一个PizzaConstructor类(或一些类似名称)的类,其中构建对象所需的大部分技巧都Pizza被编码到Constructor.

这里有一个很好的讨论,但重点是这种形式将如何构造的技巧放在了aPizza中Factory,而不是让类陷入困境Pizza。

通过这种技术,您可以使构造函数代码比通常情况下更加清晰。

Pizza pizza = PizzaFactory.addTopping(Cheese)
    .addTopping(Anchovies)
    .thickCrust()
    .stuffedCrust(Gruyere)
    .stoneBaked()
    .buildPizza();
Run Code Online (Sandbox Code Playgroud)

使用工厂的第二种情况是当您需要您的类能够实际创建所提供类型的对象时。如果用户不提供工厂机制供您使用,这是很困难的。然后,用户提供某种工厂机制,可能是工厂对象,也可能扩展您的抽象类并提供具体的构造函数方法。

  • 这更像是建造者模式而不是工厂。 (6认同)