一、基本介绍
工厂方法模式(创建型):定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
二、包含角色
1.抽象工厂:提供了创建产品的接口,每个具体工厂的父类接口。
2.具体工厂:抽象工厂的实现类,负责创建具体的产品。
3.抽象角色:需要定义产品的抽象,为工厂创建出来实例的公共接口。
4.具体产品:抽象角色的实现类,由工厂返回的具体产品实例。
三、案例及UML类图
案例说明:
某个客户需要不同种类的交通工具,我们使用简单工厂根据客户需要去创建不同种类的交通工具,并且该客户以后 可能还会拓展新的种类。
UML类图:
类VehicleFactory:
public interface VehicleFactory {
Vehicle getVehicle();
}
说明:交通工具工厂接口,抽象工厂角色,定义所有工厂的公共接口。
类BicycleFactory:
public class BicycleFactory implements VehicleFactory {
@Override
public Vehicle getVehicle() {
return new Bicycle();
}
}
说明:自行车工厂类,具体工厂角色,用于创建自行车产品。
类CarFactory:
public class CarFactory implements VehicleFactory {
@Override
public Vehicle getVehicle() {
return new Car();
}
}
说明:汽车工厂类,具体工厂角色,用于创建汽车产品。
类Vehicle:
public interface Vehicle {
/**
* 交通工具都能开,且每一类交通工具行驶的方式都不一样
*/
void drive();
}
说明:交通工具接口定义类,抽象角色。
类Bicycle:
public class Bicycle implements Vehicle {
@Override
public void drive() {
System.out.println("自行车两个轮子行驶!");
}
}
说明:交通工具类Vehicle的实现类之一,具体产品,自行车产品。
类Car:
public class Car implements Vehicle {
@Override
public void drive() {
System.out.println("汽车四个轮子行驶!");
}
}
说明:交通工具类Vehicle的实现类之一,具体产品,汽车产品。
类FactoryMethodTest:
public class FactoryMethodTest {
public static void main(String[] args) {
//客户端通过创建不同的工厂来创建不同的产品
VehicleFactory factory = new CarFactory();
Vehicle vehicle1 = factory.getVehicle();
factory = new BicycleFactory();
Vehicle vehicle2 = factory.getVehicle();
vehicle1.drive();;
vehicle2.drive();
}
}
说明:测试以及客户端类。
四、优缺点
优:符合开闭原则,当需要新增产品时,新增具体工厂类和具体产品类即可。
缺:每次都需要创建多个类,增加系统开销。当抽象类要修改时,则需要修改大量的具体子类,增大工作量。
五、适用场景
1.适用于不知道具体种类且种类短时间还会继续增加的对象的创建,可无限拓展(如奶茶店的奶茶种类,可能明天 * 又会推出新的奶茶)
六、其它
注意事项:工厂方法模式是一个工厂创建一种产品,每次有新种类的产品要添加时,必须创建新的工厂以及新的产品。