Factory Method(工厂方法)模式的主要意图是用于创建对象的接口,同时控制对哪个对象进行实例化。在工厂方法中,工厂方法用户不必知道该实例化什么类,其意图主要在于为所实例化的多个类定义一个公共接口,并由服务提供者而不是由客户代码来确定将要实例化上述类中的哪一个类。
工厂方法模式经常出现在客户代码中,尤其发生在客户代码不需要了解具体实例化哪一个类的情况下。使用工厂方法模式的典型范例是Collection框架中的迭代器。Iterator模式提供顺序访问集合中元素的一种方式,但是创建迭代器常常要使用Factory Method模式。Java 1.2引入了Collection接口,其中包括iterator()方法,所有集合都要实现这个方法,iterator()使得调用者不必了解需要实例化哪个类。
在Java Collection框架中,抽象类AbstractList<E>拥有如下方法:
其中,Itr定义为AbstractList<E>的一个内部私有类,代码示例如下:
通过iterator()方法创建的对象顺序包含了集合中的各个元素,迭代器的具体使用可以参考如下代码:
在常用的Spring Web架构中,org.springframework.beans.factory.BeanFactory接口提供了Object getBean(String name)及其重载方法,可以将其看作Factory Method模式的一个典型应用。
使用Factory Method工厂方法模式的简易示例代码如下:
(1)定义多个类的公共接口Store
(2)实现具体的工厂方法
(3)测试类及输出结果
注:在上述示例中,FileStore和DatabaseStore并非一定要实现为StoreFactory的内部私有类。同时,在工厂方法模式中,有时候对公共接口的要求并非如此严格。例如,在Spring架构中,通过Spring IoC容器返回的Java对象间彼此关系通常都十分松散,并没有实现共同的接口。