抽象工厂模式(Abstract Factory Pattern) 是一种软件设计模式,属于创建型设计模式类别,主要用于处理对象的创建过程,特别是在应对具有多个相关或相互依赖对象的特定上下文时。该模式的主要目的是将一组相关或者相互依赖的对象的创建过程封装到一个单独的接口中,使得客户端可以通过统一的方式来创建并使用这些对象,同时隐藏了具体的实现细节。
抽象工厂模式的角色包括:
- 抽象工厂(Abstract Factory):
定义了一组用于创建不同但相关或相互依赖对象的接口(即产品族)。它不直接创建产品对象,而是声明一些方法,让子类来实现这些产品的创建逻辑。 - 具体工厂(Concrete Factory):
实现了抽象工厂接口,为每一种产品族提供了实际的创建逻辑。根据传入的参数或其他条件,具体工厂会创建相应的产品对象。 - 抽象产品(Abstract Product):
定义了一组产品对象的接口,这可以是接口或抽象类,它是各种具体产品对象所共有的公共接口。 - 具体产品(Concrete Product):
每个具体产品都是抽象产品的一个实现,它们构成了一个产品族。具体工厂通过创建这些具体产品来满足客户端的需求。
举例来说,假设有一个图形编辑器项目,其中存在两种图形样式(如“圆形”、“矩形”等几何图形)以及多种颜色风格(如“红色系”、“蓝色系”等)。抽象工厂可以定义创建不同形状和颜色风格的方法,而具体工厂则可以创建某一特定颜色风格下的各种形状实例,这样客户端无需关心具体的实现细节,只需调用抽象工厂提供的接口即可得到所需的产品对象。
代码示例
下面是一个基于Java的抽象工厂模式的简单代码实现示例,以创建不同类型的汽车为例,我们有普通汽车和电动汽车两类,每类汽车又有轿车和SUV两种车型。这里展示了如何使用抽象工厂来创建不同类型的具体汽车产品。
汽车分为电动和普通的轿车,suv:
// 抽象产品:汽车接口
interface Car {void drive();
}// 具体产品:普通轿车
class NormalCar implements Car {@Overridepublic void drive() {System.out.println("驾驶普通轿车");}
}// 具体产品:普通SUV
class NormalSUV implements Car {@Overridepublic void drive() {System.out.println("驾驶普通SUV");}
}// 具体产品:电动汽车轿车
class ElectricCar implements Car {@Overridepublic void drive() {System.out.println("驾驶电动汽车轿车");}
}// 具体产品:电动汽车SUV
class ElectricSUV implements Car {@Overridepublic void drive() {System.out.println("驾驶电动汽车SUV");}
抽象汽车工厂:
interface CarFactory {Car createCar();SUV createSUV();
}
普通汽车工厂:
class NormalCarFactory implements CarFactory {@Overridepublic Car createCar() {return new NormalCar();}@Overridepublic SUV createSUV() {return new NormalSUV();}
}
电动汽车工厂:
class ElectricCarFactory implements CarFactory {@Overridepublic Car createCar() {return new ElectricCar();}@Overridepublic SUV createSUV() { // 假设SUV也有一个对应的接口return new ElectricSUV();}
}
调用:
public class Client {public static void main(String[] args) {CarFactory normalFactory = new NormalCarFactory();CarFactory electricFactory = new ElectricCarFactory();Car normalCar = normalFactory.createCar();Car electricCar = electricFactory.createCar();normalCar.drive();electricCar.drive();// 同理可以创建SUV并驾驶}
}
CarFactory 是抽象工厂,NormalCarFactory 和 ElectricCarFactory 是具体工厂,Car 和 SUV 是抽象产品,而 NormalCar、NormalSUV、ElectricCar、ElectricSUV 则是具体产品。通过抽象工厂,客户端可以根据需求选择创建何种类型的具体产品。
区别于简单工厂
简单工厂模式专注于单一产品种类的创建,易于理解和实现,但当产品种类增多时,工厂类可能会变得庞大和难以维护;而抽象工厂模式旨在解决多系列产品对象的创建问题,能够更好地支持产品族的扩展,但它引入了更多的抽象层和类结构。
抽象工厂模式的缺点
- 增加系统复杂性:随着产品族数量的增长,需要创建的抽象工厂及其实现类的数量也会增加,导致系统变得更加复杂,不易于理解和维护。
- 扩展受限:如果要添加新产品,则不仅要在抽象工厂接口中添加新的方法,还需要修改所有的具体工厂类,这违反了开闭原则,增加了系统拓展的难度。
- 过度设计风险:若系统中的产品之间关联并不紧密,或者客户程序仅仅需要独立地使用某个产品,此时使用抽象工厂模式就会显得过于复杂,有可能造成设计过度。
- 无法识别新创建的产品:抽象工厂只能创建预先设定好的产品集合,若需新增一个不属于现有产品族的新产品,则原有抽象工厂很难进行适应,需要重构整个体系结构。