创建型:抽象工厂模式
目录
1、核心思想
2、实现方式
2.1 模式结构
2.2 实现案例
3、优缺点分析
4、适用场景
1、核心思想
目的:统一管理相关对象的创建,确保产品兼容性。优先用于需要强约束产品兼容性的场景(如UI主题、跨平台适配)
概念:抽象工厂模式是工厂方法模式的扩展,适用于需要生成产品家族的场景。抽象工厂模式一定是基于产品的族系划分(一组功能相关或依赖的对象)来布局的,其产品系列一定是相对固定的,故以抽象工厂来确立工业制造标准(各产品系列生产接口)。
举例:以汽车工厂举例,按品牌划分为A工厂和B工厂(两个族系),这两个品牌都有轿车、越野车、跑车3个系列的产品。基于这两个品牌的汽车工厂的系列生产线,如果以后加入新的C品牌汽车、D品牌汽车等,都可以沿用此种规划好的生产模式,这便是抽象工厂模式的基础数据模型。
2、实现方式
2.1 模式结构
四个核心角色:
-
抽象产品(AbstractProduct):定义一类产品的接口(如 轿车、越野、跑车)。
-
具体产品(ConcreteProduct):实现抽象产品接口的类(如 A品牌轿车、B品牌轿车...)。
-
抽象工厂(AbstractFactory):声明创建产品族中每个产品的方法(如
create轿车()
,create越野()
,create跑车()
)。 -
具体工厂(ConcreteFactory):实现抽象工厂接口,生成同一产品族的具体对象(如A品牌工厂、B品牌工厂)。
2.2 实现案例
// 1、抽象产品
// 轿车
public interface Car {void runCar();
}
// 越野车
public interface SuvCar {void runSuvCar();
}
// 跑车
public interface SportsCar {void runSportsCar();
}// 2、具体产品
// A品牌轿车
public class ABrandCar implements Car{@Overridepublic void runCar() {System.out.println("A品牌轿车运行");}
}
// A品牌越野车
public class ABrandSuvCar implements SuvCar {@Overridepublic void runSuvCar () {System.out.println("A品牌越野车运行");}
}
// A品牌跑车
public class ABrandSportsCar implements SportsCar {@Overridepublic void runSportsCar () {System.out.println("A品牌跑车运行");}
}
// B品牌轿车
public class BBrandCar implements Car{@Overridepublic void runCar() {System.out.println("B品牌轿车运行");}
}
// B品牌越野车
public class BBrandSuvCar implements SuvCar {@Overridepublic void runSuvCar () {System.out.println("B品牌越野车运行");}
}
// B品牌跑车
public class BBrandSportsCar implements SportsCar {@Overridepublic void runSportsCar () {System.out.println("B品牌跑车运行");}
}// 3、抽象工厂
public interface BrandFactory {Car createCar();SuvCar createSuvCar();SportsCar createSportsCar();
}// 4、具体工厂
// A品牌工厂
public class ABrandFactory implements BrandFactory{@Overridepublic Car createCar() {return new ABrandCar();}@Overridepublic SuvCar createSuvCar() {return new ABrandSuvCar();}@Overridepublic SportsCar createSportsCar() {return new ABrandSportsCar();}
}
// B品牌工厂
public class BBrandFactory implements BrandFactory{@Overridepublic Car createCar() {return new BBrandCar();}@Overridepublic SuvCar createSuvCar() {return new BBrandSuvCar();}@Overridepublic SportsCar createSportsCar() {return new BBrandSportsCar();}
}// 5、客户端
public class Application {public static void main(String[] args) {BrandFactory factory = new ABrandFactory();factory.createCar();factory.createSuvCar();factory.createSportsCar();factory = new BBrandFactory();factory.createCar();factory.createSuvCar();factory.createSportsCar();}
}
3、优缺点分析
优点 | 缺点 |
---|---|
保证产品族兼容性 | 新增产品类型需修改所有工厂接口 |
客户端与具体类解耦 | 代码复杂度高(类数量成倍增加) |
支持灵活切换产品族(如切换主题) | 难以扩展新产品(违反开闭原则) |
工厂方法模式与抽象工厂模式对比:
维度 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|
核心目的 | 创建单一类型对象 | 创建相关/依赖的对象家族 |
产品维度 | 处理一个产品等级结构(垂直方向) | 处理多个产品等级结构(水平方向) |
接口复杂度 | 单一工厂方法 | 包含多个工厂方法的接口 |
扩展方向 | 新增产品类型需修改代码 | 新增产品家族易扩展,新增产品类型难 |
典型应用场景 | 日志记录器、数据库连接器等单一产品场景 | 跨平台UI组件、主题系统等系列产品场景 |
子类数量 | 每个产品对应一个子类工厂 | 每个产品家族对应一个子类工厂 |
4、适用场景
-
跨平台应用:跨平台UI组件开发(Windows/Mac风格)
-
主题系统:切换整体风格(如深色/浅色主题)。
-
数据库兼容:企业级应用的多数据库适配(连接器+查询器+事务管理器)
-
游戏开发:游戏引擎的多主题支持(中世纪/科幻风格)