定义:
抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下: Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。)
抽象工厂模式通用类图
抽象工厂设计模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类,即可生成属于同一产品族的对象组合。
角色:
工厂方法模式包含以下几个核心角色:
1、抽象工厂(Abstract Factory):声明创建各产品类型的抽象方法(如createButton()、createTextField()),规范产品族的创建接口。
2、具体工厂(Concrete Factory):实现抽象工厂接口,负责创建某一具体产品族的所有产品。
3、抽象产品(Abstract Product):声明产品的通用接口,规范产品的行为。
4、具体产品(Concrete Product):实现抽象产品接口,代表具体产品族中的实际产品。
代码示例:
下面我们通过一个简单的示例来演示抽象工厂模式的实现。假设我们有比亚迪和红旗两种车型品牌,每一种品牌都包含了BUS和SUV车。
// 抽象产品类
public interface ISUVCar {
void produce();
}
// 抽象产品类
public interface IBUSCar {
void produce();
}
// 具体产品
public class BYDSUVCar implements ISUVCar {
@Override
public void produce() {
System.out.println("我是比亚迪生产的SUV!");
}
}
// 具体产品
public class BYDBUSCar implements IBUSCar {
@Override
public void produce() {
System.out.println("我是比亚迪生产的BUS!");
}
}
// 具体产品
public class HongqiSUVCar implements ISUVCar {
@Override
public void produce() {
System.out.println("我是红旗生产的SUV!");
}
}
// 具体产品
public class HongqiBUSCar implements IBUSCar {
@Override
public void produce() {
System.out.println("我是红旗生产的BUS!");
}
}
// 抽象工厂类
public interface Factory {
ISUVCar createSUV();
IBUSCar createBUS();
}
// 具体工长类
public class BYDFactory implements Factory {
@Override
public ISUVCar createSUV() {
return new BYDSUVCar();
}
@Override
public IBUSCar createBUS() {
return new BYDBUSCar();
}
}
// 具体工长类
public class HongqiFactory implements Factory {
@Override
public ISUVCar createSUV() {
return new HongqiSUVCar();
}
@Override
public IBUSCar createBUS() {
return new HongqiBUSCar();
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
Factory bydFactory = new BYDFactory();
bydFactory.createSUV().produce();
bydFactory.createBUS().produce();
Factory hongqiFactory = new HongqiFactory();
hongqiFactory.createSUV().produce();
hongqiFactory.createBUS().produce();
}
}
优点 :
高内聚性:将同一产品族的对象创建逻辑封装在同一个工厂类中,便于维护和管理。
低耦合性:客户端依赖抽象接口而非具体类,更换产品族时只需替换工厂实例,符合开闭原则。
产品族一致性:确保创建的对象属于同一族,避免不兼容的产品组合。
缺点:
扩展产品类型困难:新增产品类型(如在 UI 框架中新增 “下拉框” 组件)时,需修改抽象工厂接口及所有具体工厂类,违背开闭原则。
类数量膨胀:每个产品族对应一个具体工厂,当产品族较多时,会导致类数量激增。
过度设计风险:若产品族仅有一个,使用抽象工厂模式可能增加不必要的复杂度。
使用场景:
(一)需要创建产品家族
当系统需要创建的对象属于多个相关产品族(如不同操作系统的 UI 组件、不同品牌的汽车部件),且产品族内的对象需要配套使用时。
(二)系统不依赖具体产品实现
客户端只需通过抽象接口操作产品,无需知道具体实现类,降低与具体产品的耦合。
(三)限制产品组合的变化
确保同一产品族的对象被协同创建,避免不同族产品混合使用导致的兼容性问题。
抽象工厂设计模式通过 “产品家族” 的概念,为创建一组相关对象提供了结构化的解决方案。它通过抽象接口解耦客户端与具体实现,确保同一族产品的一致性,尤其适合跨平台开发、组件化架构等场景。然而,其对产品类型扩展的限制也要求我们在使用时谨慎评估需求,避免过度设计。