1.介绍
抽象工厂模式是工厂模式的进一步优化,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。属于创建型模式。
UML图:
2.示例
车辆制造工厂,不仅可以制造轿车也可以用来生产自行车。
1)AbstractFactory:VehicleFactory
public interface VehicleFactory {
/**
* 建造自行车
*
* @return
*/
Bike createBike();
/**
* 建造轿车
*
* @return
*/
Car createCar();
}
2)AbstractProductA:Bike
public interface Bike {
void bikeName();
}
3)AbstractProductB:Car
public interface Car {
void carName();
}
4)ConcreteFactoryA:BMWVehicleFactory
public class BMWVehicleFactory implements VehicleFactory {
@Override
public Bike createBike() {
return new BMWBike();
}
@Override
public Car createCar() {
return new BMWCar();
}
}
5)ConcreteFactoryB:TeslaVehicleFactory
public class TeslaVehicleFactory implements VehicleFactory {
@Override
public Bike createBike() {
return new TeslaBike();
}
@Override
public Car createCar() {
return new TeslaCar();
}
}
6)ConcreteProductA1:BMWCar
public class BMWCar implements Car{
@Override
public void carName() {
System.out.println("宝马 x5 四驱 燃油车");
}
}
7)ConcreteProductA2:TeslaCar
public class TeslaCar implements Car {
@Override
public void carName() {
System.out.println("特斯拉 modelY 四驱 电动车");
}
}
8)ConcreteProductB1:BMWBike
public class BMWBike implements Bike{
@Override
public void bikeName() {
System.out.println("宝马 碳纤维 大喇叭 二驱 自行车");
}
}
9)ConcreteProductB2:TeslaCar
public class TeslaCar implements Car {
@Override
public void carName() {
System.out.println("特斯拉 modelY 四驱 电动车");
}
}
10)运行:
结合建议工厂模式:工厂生产者,可以再进行优化,通过反射的机制动态构建
public class VehicleFactoryProducer {
/**
* 超级工厂
*
* @param vehicleName
* @return
*/
public static VehicleFactory creatVehicleFactory(String vehicleName) {
if ("BMW".equals(vehicleName)) {
return new BMWVehicleFactory();
} else if ("Tesla".equals(vehicleName)) {
return new TeslaVehicleFactory();
}
return null;
}
}
运行类
public class Main {
public static void main(String[] args) {
System.out.println("------BMW制造工厂-----");
VehicleFactory bmwFactory = VehicleFactoryProducer.creatVehicleFactory("BMW");
bmwFactory.createBike().bikeName();
bmwFactory.createCar().carName();
System.out.println("\n------Tesla制造工厂-----");
VehicleFactory teslaFactory = VehicleFactoryProducer.creatVehicleFactory("Tesla");
teslaFactory.createCar().carName();
teslaFactory.createBike().bikeName();
}
}
3.总结
1)优点:
a. 让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂实现分离,不会出现在客户代码中
b. 可以保证使用方始终只使用同一个产品族中的对象
c. 扩展容易,只需要增加新的产品类和对应的工厂类即可
2)缺点:
a. 不符合开闭原则,新增产品类时需要修改抽象工厂和抽象产品中的代码
b. 增加了系统的复杂性和抽象性