JavaScript must be enabled in order for you to view this page. However, it seems JavaScript is either disabled or not supported by your browser. To view this page, enable JavaScript by changing your browser options, then Try again! .

文章目录
 
我的论坛
Google 网上论坛 Beta 版
Do Best Developer
访问此论坛

工厂方法模式(Factory Method)

solo L
发布日期:2006年12月01日,更新日期:2006年12月01日

写在前面

如果您还没有阅读面向对象设计(Object-Oriented Design),那么我建议您从那里开始。

回页首

名称

工厂方法模式(Factory Method)

回页首

结构

工厂方法模式发展了简单工厂模式。在简单工厂模式中只有一个具体的工厂,而在工厂方法模式中有一个工厂层次结构。这克服了简单工厂模式的缺点,使得具体工厂和具体产品可以平行的发展,从而更加符合开闭原则。

如果工厂方法模式中的工厂层次结构退化成为一个具体工厂,那么工厂方法模式就退化成了简单工厂模式。

这里有四个参与者,抽象工厂(Creator)、具体工厂(ConcreteCreator)、抽象产品(Product)和具体产品(ConcreteProduct)。客户能够看到抽象工厂、抽象产品和具体的工厂。这里有一点似乎不是很完美,就是要由客户负责创建具体工厂。在Java中我们可以通过在工厂层次结构中使用简单工厂模式来解决这个问题。如果您对如何使用简单工厂模式来解决这个问题还不是很清楚可以参考相关模式中列出的简单工厂模式。

从客户的角度出发来看这个模式它是符合开闭原则的,即当我们要为系统添加新的具体产品时只需要添加一个具体工厂和一个具体产品,而这不会不影响客户。

工厂方法模式的结构图
回页首

示例

如果您在学习 Java SE 或 Eclipse 的过程中发现了适合这里的示例,希望能告诉我们。我们会在团队中感谢给予我们帮助的朋友们。

示例 1

这个示例源于Java SE。您可以查阅java.util.PriorityQueue。

PriorityQueue

示例 2

这个示例源于Eclipse 3.2。您可以查阅org.eclipse.update.core。

ISiteFactory

在这个示例中我们可以通过构建新的具体工厂来方便的添加新的具体的ISite实现,这是工厂方法模式的原始用意。如果您了解创建ISite的具体实现的方式多种多样的话,就会发现另外的优势。即通过提供新的具体工厂来为相同的具体产品提供不同的创建方式。这就形成了多个具体工厂创建相同产品而创建的方式各不相同的场景。这在现实中也是很常见的。

示例 3

这个示例源于Java SE。您可以查阅java.net.URL。

这里连续两次使用了工厂方法模式。另外在URL中还有一个发现各种URLStreamHandler的机制。具体可以查阅URLStreamHandler.getURLStreamHandler(String protocol)方法。

URL
回页首

变体

如果您在学习 Java SE 或 Eclipse 的过程中发现了适合这里的变体,希望能告诉我们。我们会在团队中感谢给予我们帮助的朋友们。

变体 1

这是一个很有趣的变体,它的用意与工厂方法模式的原始用意不同。在这里客户可以看到抽象工厂、抽象产品和具体产品,而看不到具体工厂,这也和通常的工厂方法模式不同。

这里的具体产品不是由具体工厂创建的,而是由客户创建的。具体的工厂从客户那里接收创建好的产品然后对该产品进行进一步的加工,换句话说,具体工厂只封装了产品的再加工过程。

在下面的示例中PageLayout扮演具体产品,org.eclipse.ui.internal.Perspective扮演客户。

这个示例源于Eclipse 3.2。您可以查阅org.eclipse.ui.IPerspectiveFactory。

IPerspectiveFactory
回页首

相关模式

简单工厂模式(Simple Factory)

抽象工厂模式(Abstract Factory)

关于作者
solo L 一位有些理想主义的软件工程师,创建了solol.org。他常常在这里发表一些对技术的见解。