我知道有很多关于不同工厂模式差异的问题,但答案是如此不同和令人困惑。我读过的书使用了不清楚和(过度)简化的例子。即使在阅读了维基百科的解释以及关于它们的大量在线解释(包括这些网站上的所有解释)之后,我仍然有很多问题。我目前正在阅读的书是 Head First Design Patterns。
在简单工厂中,客户端使用带有工厂方法(可以是静态的)的单独类 (Creator) 来返回产品。
在工厂方法模式中,Creator 和 Client 是一回事,他们使用同一个类中的抽象方法来创建新产品,并在同一个类中对其进行操作。当然,Creator(或 Client)是抽象的,因此关于制作具体产品的决定被推迟到子类。
我的理解是否正确(例如,FMP 中的 Client 和 Creator 是同一事物,我从未在 FMP 图表中看到 Client)?
在工厂方法模式中,创建方法在 Creator 之外是不可重用的,所以它只能在创建一些新的 Creator 时重用?
在什么情况下我可以二选一?
(附:请不要将此标记为重复,我想在本网站上明确说明)
最佳答案
简单工厂是类形式的工厂。因此,它并没有优雅地解决问题,因为对于 Product 的每个新子类,您都必须在 create() 方法中编辑 switch 语句。这违反了打开/关闭原则。使简单工厂有用的一种潜在方法是使用类注册,如下所示:http://www.oodesign.com/factory-pattern.html
工厂方法是一种工厂形式的方法(因此得名)。这并不违反开闭原则,因为您是通过扩展而不是修改代码来处理变化的。
你的理解是正确的。 FMP 中的 Client 和 Creator/Factory 是相同的,因为 Factory(方法)是 Client 的一部分。
确实FMP中的create方法是不可复用的。不过这没关系,因为这不是尝试创建产品的应用程序范围的工厂,而是一种让客户无需使用 new 即可创建其依赖对象的方法。
我不能回答你第三个问题,因为我认为这是基于偏好。
关于java - 简单工厂和工厂方法模式的动机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20848082/