Skip to content

工厂方法模式

亦称: 简单工厂模式,虚拟构造函数、Virtual Constructor、Factory Method

1. 简介

工厂方法模式是一种创建型设计模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例。被创建的实例通常都具有共同的父类。

2. 模拟场景

假设你正在开发一款物流管理应用。最初版本只能处理卡车运输, 因此大部分代码都在位于名为 卡车的类中。一段时间后,这款应用变得极受欢迎。你每天都能收到十几次来自海运公司的请求,希望应用能够支持海上物流功能。
Alt text 这可是个好消息。但是代码问题该如何处理呢?目前大部分代码都与卡车类相关。在程序中添加轮船类需要修改全部代码。更糟糕的是,如果你以后需要在程序中支持另外一种运输方式,很可能需要再次对这些代码进行大幅修改。最后你将不得不编写繁复的代码,根据不同的运输对象类,在应用中进行不同的处理。

3. 解决方案

工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用new运算符)。不用担心,对象仍将通过new运算符创建,只是该运算符改在工厂方法中调用罢了。工厂方法返回的对象通常被称作“产品”。
Alt text 乍看之下,这种更改可能毫无意义:我们只是改变了程序中调用构造函数的位置而已。但是仔细想一下,现在你可以在子类中重写工厂方法,从而改变其创建产品的类型。
在工厂设计模式之外值得注意的是不同类型的产品需要有一个公共的父类或者接口才行,不然编译肯定通不过。

4. Java中的例子

  • java.util.Calendar#getInstance()
  • java.util.ResourceBundle#getBundle()
  • java.text.NumberFormat#getInstance()
  • java.nio.charset.Charset#forName()
  • java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
  • java.util.EnumSet#of()
  • javax.xml.bind.JAXBContext#createMarshaller()
  • Spring的BeanFactory