一、抽象工厂模式概述
1.1 模式介绍
抽象工厂模式是一种创建类模式,它提供了一种封装一组具有共同主题的单个工厂的方法。在抽象工厂模式中,客户端不需要知道实例是如何创建的,只需知道工厂的名字即可。这种模式可用于将一组具有共同主题的工厂对象的创建过程与他们的实际使用过程分离。
1.2 模式定义
抽象工厂模式(Abstract Factory Pattern)定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式是工厂方法模式的升级,它提供了一种接口,用于创建一系列相关的或相互依赖的对象,而不需要指定它们的具体类。
抽象工厂模式包含的角色有抽象工厂、具体工厂、抽象产品和具体产品。抽象工厂定义了工厂的接口,具体工厂实现了抽象工厂的接口,抽象产品定义了产品的接口,具体产品实现了抽象产品的接口。
抽象工厂模式的核心在于抽象工厂类中包含了一组创建产品的方法,由具体的工厂类来实现这些方法,从而可以创建一组相关或依赖的产品。
二、抽象工厂模式结构与分析
2.1 模式结构
抽象工厂模式包含抽象工厂、具体工厂、抽象产品和具体产品四个要素。其中,抽象工厂是工厂方法模式的核心,其包含多个创建产品的方法,每个方法用于创建一个种类的产品。具体工厂是抽象工厂的实现类,负责创建一组具体的产品。抽象产品定义了产品的接口,具体产品实现了抽象产品的接口。
2.2 模式分析
抽象工厂模式是一种创建类模式,它在工厂方法模式基础上扩展了工厂的能力,可以创建一组相关或相互依赖的对象。抽象工厂模式的核心在于抽象工厂类包含多个创建产品的接口方法,由具体的工厂类来实现这些方法并创建具体产品。
在使用抽象工厂模式时,客户端不需要知道实例是如何创建的,只需知道工厂的名字即可。抽象工厂模式提供了一种将工厂对象的创建过程与实际使用过程分离的方法,使得客户端代码更加灵活,且易于维护和扩展。
三、抽象工厂模式实例
接下来,我们将举个例子来更好理解抽象工厂模式。
3.1 车辆生产
在现实生活中,汽车制造商提供多种车型,例如轿车和卡车,并且每种车型又有多种不同的配置,如发动机型号、内饰材质等。现使用抽象工厂模式模拟该场景。
产品类:
// 抽象产品:轿车
public interface Car {
void showInfo();
}
// 具体产品:轿车A
public class CarA implements Car {
@Override
public void showInfo() {
System.out.println(“This is a CarA.”);
}
}
// 具体产品:轿车B
public class CarB implements Car {
@Override
public void showInfo() {
System.out.println(“This is a CarB.”);
}
}
// 抽象产品:卡车
public interface Truck {
void showInfo();
}
// 具体产品:卡车A
public class TruckA implements Truck {
@Override
public void showInfo() {
System.out.println(“This is a TruckA.”);
}
}
// 具体产品:卡车B
public class TruckB implements Truck {
@Override
public void showInfo() {
System.out.println(“This is a TruckB.”);
}
}
抽象工厂类:
// 抽象工厂:车辆工厂
public interface VehicleFactory {
Car produceCar();
Truck produceTruck();
}
// 具体工厂:轿车工厂
public class CarFactory implements VehicleFactory {
@Override
public Car produceCar() {
// 某些具体的轿车生产过程
return new CarA();
}
@Override
public Truck produceTruck() {
throw new UnsupportedOperationException("CarFactory does not produce trucks.");
}
}
// 具体工厂:卡车工厂
public class TruckFactory implements VehicleFactory {
@Override
public Car produceCar() {
throw new UnsupportedOperationException(“TruckFactory does not produce cars.”);
}
@Override
public Truck produceTruck() {
// 某些具体的卡车生产过程
return new TruckA();
}
}
客户端:
// 客户端代码
public class VehicleTest {
public static void main(String[] args) {
VehicleFactory carFactory = new CarFactory();
VehicleFactory truckFactory = new TruckFactory();
Car car = carFactory.produceCar();
car.showInfo(); // 输出:This is a CarA.
Truck truck = truckFactory.produceTruck();
truck.showInfo(); // 输出:This is a TruckA.
}
}
在该例子中,抽象工厂模式被用于模拟汽车制造厂生产轿车和卡车的过程。其中,抽象产品角色包括车辆(Car)和卡车(Truck),具体产品角色包括轿车A(CarA)、轿车B(CarB)、卡车A(TruckA)和卡车B(TruckB)。具体工厂角色包括车辆工厂(VehicleFactory)、轿车工厂(CarFactory)和卡车工厂(TruckFactory)。
四、抽象工厂模式优缺点
抽象工厂模式具有以下优点和缺点:
优点:
- 抽象工厂模式将工厂对象的创建过程与实际使用过程分离,使得客户端代码更加灵活。
- 抽象工厂模式通过工厂对象的抽象接口,可以将一组相关或相互依赖的产品进行封装,实现了产品族的概念,增加了系统的可扩展性。
- 抽象工厂模式可以使得客户端代码更容易切换不同的具体工厂和产品族,从而满足不同的需求。
缺点:
- 当需求变更时,若需要增加新的产品线(例如增加汽车型号),则需要修改抽象工厂和所有具体工厂的代码,使得系统具有较高的可变性,增加了维护成本。
- 当产品族中的产品种类越来越多时,会导致抽象工厂类变得庞大,使得系统复杂度增加。
因此,在使用抽象工厂模式时,需要权衡其优点和缺点,并根据具体的需求和场景来选择合适的设计模式。如果系统中存在多个相关的产品族需要进行封装,或者需要满足客户端代码更易于拓展和切换不同的产品族的需求,抽象工厂模式是一种较为合适的设计模式选择。