一、模式定义
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
二、模式定义
Product:它是定义产品的接口,是工厂方法模式所创建的产品的父类。
ConcreteProduct:具体产品.
Factory:抽象工厂类中声明了工厂方法。
ConcreteFactory:具体的工厂方法,继承了抽象工厂类,用来生产具体的对象。
三、实例分析
详情请见
类图如下:
四、模式优缺点
工厂方法模式,是简单工厂模式的升级。完成了一些简单工厂模式不能完成的事情。
-1.优点:
在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户端隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需要产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
基于工厂角色和产品角色的多态性设计是工厂方法的关键,他能够让工厂模式自主的创建产品对象,而如何创建这个对象的细节完全封装在工厂类。
使用工厂方法模式最大的优点就是你新加类的时候不用动源代码,只要写新的产品新的工厂来继承对应的类就行了。
- 2.缺点:
既是优点又是缺点,你要新加类型的时候,既要创建产品类,又要创建工厂类,增加了一大波类。在一定的程度上增加系统的复杂度。
由于考虑到系统的可在性,需要引入抽象层,在客户·端代码中均用抽象定义,更加难以理解!
五、在JDK源码中的应用
Collection.java:
package java.util;
public interface Collection<E> extends Iterable<E> {
//工厂方法
Iterator<E> iterator();
}
例如在ArrayList
中的实现
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public Iterator<E> iterator() {
return new Itr(); //具体实现交由子类实现
}
private class Itr implements Iterator<E> {
//..
}
}
具体的类图如下:
从上面可以看到:
ArrayList
继承Collection
,Itr
继承自Iterator
,在Arraylist实现iterator()
方法,交由子类实现。