简单工厂模式 (参见http://blog.youkuaiyun.com/zj_1395201/article/details/6648340)的核心是那个核心工厂类,其决定何时创建哪一个具体产品。这样做的优点可以使客户端不必负责产品的具体创建,只需要消费产品即可。但是缺点是如果具体产品的种类很多的话,核心工厂类中判断逻辑会很复杂,而且如果需要加入新的产品时,就需要将创建该新产品的逻辑加入到核心工厂类中去!
工厂方法模式是简单工厂模式的进一步抽象与推广,由于运用了多态性,既继承了简单工厂模式的优点,又客服了其缺点。下面我们就来解释下工厂方法模式:
工厂方法模式的核心工厂类不再决定创建具体的产品,而是将创建具体产品的操作交给了子工厂类,而子工厂会对应一个具体的产品,并且负责其的创建工作。所以我们可以看出,此时的核心工厂类已经变成了一个抽象工厂角色,仅仅向子工厂提供必须实现的接口。其工作结构如下图所示:
这种进一步抽象的效果可以达到在需要加入新产品的时候,不需要修改具体的工厂类的效果!
抽象工厂:
public interface Creator {
public Fruit getFruit();
}
具体工厂1:
public class AppleCreator implements Creator {
@Override
public Fruit getFruit() {
return new Apple();
}
}
具体工厂2:
public class GrapeCreator implements Creator {
@Override
public Fruit getFruit() {
// TODO Auto-generated method stub
return new Grape();
}
}
抽象产品:
public interface Fruit {
/**
* 种植
*/
public void plant();
}
具体产品1:
public class Grape implements Fruit {
public Grape(){
System.out.println("Grape is produced...");
}
@Override
public void plant() {
System.out.println("Grape is plant...");
}
}
具体产品2:
public class Apple implements Fruit {
public Apple(){
System.out.println("Apple is produced...");
}
@Override
public void plant() {
System.out.println("Apple is plant...");
}
}
客户端消费产品 :
public class Client {
public static void main(String[] args) {
Creator c1 = new AppleCreator();
Fruit apple = c1.getFruit();
System.out.println("=============");
Creator c2 = new GrapeCreator();
Fruit grape = c2.getFruit();
}
}