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

标签 java oop design-patterns factory factory-pattern

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

在简单工厂中,客户端使用带有工厂方法(可以是静态的)的单独类 (Creator) 来返回产品。

在工厂方法模式中,Creator 和 Client 是一回事,他们使用同一个类中的抽象方法来创建新产品,并在同一个类中对其进行操作。当然,Creator(或 Client)是抽象的,因此关于制作具体产品的决定被推迟到子类。

  1. 我的理解是否正确(例如,FMP 中的 Client 和 Creator 是同一事物,我从未在 FMP 图表中看到 Client)?

  2. 在工厂方法模式中,创建方法在 Creator 之外是不可重用的,所以它只能在创建一些新的 Creator 时重用?

  3. 在什么情况下我可以二选一?

(附:请不要将此标记为重复,我想在本网站上明确说明)

最佳答案

简单工厂是形式的工厂。因此,它并没有优雅地解决问题,因为对于 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/

相关文章:

android - 如何在另一个界面中隐藏一个界面?

java - 如何在 Java Google App Engine 中检查传入电子邮件的 DKIM 签名

java - 循环只删除第一个文件

javascript - 有效的 JavaScript : Making your Constructor Function new-agnostic

c++ - 创建具有受限属性的类型

javascript - 什么是记忆化?

java - 从基于配置的服务 bean 切换到基于注释的服务 bean 时的 TransactionProxyFactoryBean

javascript - 折叠所有项目并仅展开其中一项

java - 创建一个成员函数/方法/,它同时创建原始数据类型数组 - int、double、String

c - C语言是面向对象的吗?