GoF定义:定义一个用于创建对象的接口,但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类(Define an interface for creating an object, but let subclasses decide which class to instantiate. The factory method lets a class defer instantiation to subclasses)。
工厂方法是常用的一种设计模式。它有两个要素:工厂和产品。根据不同场景,从工厂获得不同的产品,而用户无需了解产品具体是怎么构建的,解决了接口选择的问题。
有一个典故是这样讲的: 大众只有一款车叫高尔夫,拉长就是帕萨特,改名就叫迈腾,减掉一个后座就是CC,再拉长就叫辉腾,拍成方的就是途安,加多三个后座就是夏朗,加高底盘就是途观,再撑大点就是途锐,拍扁就是尚酷,加个后尾就是速腾,缩短点是POLO.
我们用工厂方法来描述这个段子。从中得知,大众基于一个通用的平台生产不同型号的车,这是一个抽象接口,定义为VehicleBase. 客户下了订单之后,工厂(VolkswagenFactory)在此基础上改变形状和内饰,就变成了不同型号的车。
我们的程序如下:
/**
* Factory method patterns
*/
// 车的接口
abstract class IVehicle {
protected String name;
public void didi() {
System.out.println("DiDi");
}
public abstract String getBrandName();
}
class Passat extends IVehicle {
public Passat() {
name = "Passat";
}
@Override
public String getBrandName() {
return name;
}
}
class Magotan extends IVehicle {
public Magotan() {
name = "Magotan";
}
@Override
public String getBrandName() {
return name;
}
}
// 制造不同车型的工厂
class VolkswagenFactory {
public IVehicle getCar(String name) {
IVehicle v = null;
switch (name) {
case "Mago":
v = new Magotan();
break;
case "Pass":
v = new Passat();
break;
}
return v;
}
}
public class Main {
public static void main(String[] args) {
// 通过工厂获得具体的车型
VolkswagenFactory volkswagenFactory = new VolkswagenFactory();
IVehicle mago = volkswagenFactory.getCar("Mago");
System.out.println(mago.getBrandName());
}
}