工厂方法模式是类的创建模式,又叫做虚拟构造子模式或者多态性工厂模式。


工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
在工厂模式方法中,核心的工厂类不再负责所有的产品的创建,而是将具体的创建工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应该被实例化这种细节。
工厂方法模式的结构:

抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色常常使用抽象java类实现。
具体工厂角色:担任这个角色的是实现了抽象工厂接口的具体java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同又有拥有的接口。在实际的系统中,这个角色常常使用抽象java类实现。
具体产品角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
简单工厂模式和工厂方法模式:
工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建欣慰继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
工厂方法模式之所以有一个别名叫做多态性工厂模式,显然是因为具体工厂类都有共同的接口,或者具有共同的抽象父类。
如果系统需要加入一个新产品,那么所需要的就是向系统中加入一个这个产品类以及它所对应的工厂类,没有必要修改客户端,也没毕业修改抽象工厂角色或者其他已有的具体工厂角色,对于增加新产品类而言,这个系统完全支持“开--闭”原则。
对于简单工厂模式中提到的农场系统,看一下在工厂方法模式中的实现,农场系统的设计图如下:

首先关于抽象产品以及具体产品角色,请看简单工厂模式中的实现;
接下来是抽象工厂角色:
public interface Garder {
/**
* 收获水果
*/
public Fruit getFruit();
}
然后是抽象工厂角色的实现,具体产品角色:public class AppleGarder implements Garder {
@Override
public Fruit getFruit() {
return new Apple();
}
}
public class GrapeGarder implements Garder {
@Override
public Fruit getFruit() {
return new Grape();
}
}
public class StrawberryGarder implements Garder {
@Override
public Fruit getFruit() {
return new StrawBerry();
}
}
接着看一下客户端的测试程序:public class Test {
public static Garder appleGarder, grapeGarder, strawberryGarder;
public static Fruit apple, grape, strawberry;
public static void main(String[] args) {
appleGarder = new AppleGarder();
apple = appleGarder.getFruit();
apple.plant();
grapeGarder = new GrapeGarder();
grape = grapeGarder.getFruit();
grape.plant();
strawberryGarder = new StrawberryGarder();
strawberry = strawberryGarder.getFruit();
strawberry.plant();
}
}
输出结果:apple tree is planting
grape is planting
StrawBerry is planting