1.什么是工厂方法模式(Factory Method Pattern)
工厂方法模式也被称为“虚拟构造器”(Virtual Constructor)。
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。当客户端不知道或者是不确定要创建哪个具体类的实例,又或者不想在客户端代码中指明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。使用工厂模式会给你系统带来更大的可扩展性和尽量少的修改量。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生成具体的产品对象,这样做的目的是将产品类的实例操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类
2.举例说明工厂方法模式
先创建一个交通工具接口
public interface Vehicle {
void travel();
}
然后建立具体的实现类
public class Car implements Vehicle {
@Override
public void travel() {
System.out.println("乘坐汽车出行");
}
}
public class Plane implements Vehicle {
@Override
public void travel() {
System.out.println("乘坐飞机出行");
}
}
public class Train implements Vehicle {
@Override
public void travel() {
System.out.println("乘坐火车出行");
}
}
然后建立工厂方法
public class VehicleFactory {
public Vehicle createVehicle(String type) {
if(type == null){
return null;
}
if(type.equalsIgnoreCase("Car")) {
return new Car();
} else if (type.equalsIgnoreCase("Plane")) {
return new Plane();
} else if (type.equalsIgnoreCase("Train")) {
return new Train();
} else {
return null;
}
}
}
在客户端中使用该工厂方法
public class Client {
public static void main(String[] args) {
VehicleFactory vehicleFactory = new VehicleFactory();
Vehicle car = vehicleFactory.createVehicle("Car");
car.travel();
Vehicle plane = vehicleFactory.createVehicle("Plane");
plane.travel();
Vehicle train = vehicleFactory.createVehicle("Train");
train.travel();
}
}
3.工厂方法的优势与问题
优势
–无需将特定于应用程序的类绑定到代码。
–代码只处理产品接口,因此它可以处理任何用户定义的具体产品
相比于通过构造器(new)构建对象:
–静态工厂方法可具有指定的名称
–不必在每次调用的时候都创建新对象
–可以返回原返回类型的任意子类型
潜在的问题
–客户可能需要创建Creator的一个子类,以便创建特定的具体产品。(每增加一种产品就需要增加一个新的工厂子类)
–如果客户端必须将Creator子类化,这是可以接受的,但如果不是这样,则客户端必须处理另一个演化点。