工厂方法模式是类的创建模式,又叫虚拟构造函数模式或多态性工厂模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
之前,我们说到简单工厂模式的优点是允许客户端相对独立于产品创建的过程,并在系统引入新产品的时候无需修改客户端,也就是说,它在某种程度上支持开闭原则。
但,简单工厂模式的缺点是对开闭原则的支持不够,因为如果有新的产品加入到系统中,就需要修改工厂类,将必要的逻辑加入到工厂中。
工厂方法模式的结构
从上图可以看出,这个使用了工厂方法模式的 系统涉及到以下角色:
- 抽象工厂角色(Creator):担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在实际系统中,这个角色常常使用抽象java类实现。
- 具体工厂角色(Concrete Creator): 担任这个角色的是实现了抽象工厂接口的具体java类。
- 抽象产品角色(Product): 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品角色(Concrete Product): 这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
抽象工厂角色和抽象产品角色都可以选择由java接口或者java抽象类来实现。
示意性源码如下:
抽象工厂角色Creator类源码
public interface Creator { public Product factory(); }
抽象产品角色Product类源码
public interface Product { }
具体工厂角色ConcreteCreator1类源码
public class ConcreteProduct1 implements Product { public ConcreteProduct1(){ //do something } }
具体工厂角色ConcreteCreator2类源码
public class ConcreteCreator2 implements Creator { public Product factory() { // TODO Auto-generated method stub return new ConcreteProduct2(); } }
具体产品角色ConcreteProduct1类的源码
public class ConcreteProduct1 implements Product { public ConcreteProduct1(){ //do something } }
具体产品角色ConcreteProduct2类的源码
public class ConcreteProduct2 implements Product { public ConcreteProduct2(){ //do something } }
客户端角色Client类的源码
public class Client { private static Creator creator1,creator2; private static Product prod1,prod2; public static void main(String[] args) { // TODO Auto-generated method stub creator1 = new ConcreteCreator1(); prod1 = creator1.factory(); creator2 = new ConcreteCreator2(); prod2 = creator2.factory(); } }
示例
工厂方法模式在农场系统中的实现
设计图如下:
代码如下:
然后是产品相关
java语言中工厂方法模式的例子
在java聚集中的应用
一个具体的java聚集对象会通过这个iterator方法接口返还一个具体的Iterator类。
可以看出,这个iterator()方法就是一个工厂方法。