抽象类不实现抽象工厂模式,但作为抽象产品基类或工厂基类参与其设计:统一产品族行为契约、封装模板方法、提供通用创建逻辑,并与工厂方法协同支持层级化扩展。

Java 抽象类本身不直接“实现”抽象工厂模式,但它常作为抽象产品角色或模板基类参与该模式的结构设计。抽象工厂模式的核心在于解耦“产品族”的创建逻辑,而抽象类在此过程中承担定义公共行为、共享初始化逻辑或封装模板方法的关键职责。下面从实际协作角度说明如何配合使用:
抽象类作为抽象产品基类,统一产品族的行为契约
抽象工厂产出的是一组相关产品(如 MySQLConnection + MySQLStatement),它们虽属不同类,但往往有共性逻辑。这时可让每个产品等级结构(如所有 Connection 实现)继承同一个抽象类,而非仅用接口:
- 若多个具体连接类需共享日志字段、超时配置或基础校验逻辑,用抽象类比接口更合适
- 例如定义
abstract class DBConnection,含protected final long timeout和public final void connect()模板方法,子类只重写doConnect() - 这样既保留多态能力(
DBConnection conn = factory.createConnection();),又避免重复代码
抽象类作为工厂的基类,封装通用创建逻辑
虽然标准抽象工厂是接口,但在需要预处理、参数校验或统一资源管理时,可用抽象类替代:
- 定义
abstract class AbstractDBFactory,声明abstract Connection createConnection();和abstract Statement createStatement(); - 同时提供
protected void validateConfig()或public final <t> T withRetry(Supplier<t> op)</t></t>等复用方法 - 具体工厂(如
MySQLFactory)继承它,专注实现创建逻辑,不重复处理通用流程
抽象类与工厂方法协同,支持层级化产品扩展
当产品族内部存在子类型差异(如 Car 分为 Sedan 和 SUV,且每种又有 Electric/Normal 变体),可结合抽象类+工厂方法:
- 定义抽象产品
abstract class Car,含abstract void drive();和final void start()(统一启动逻辑) - 抽象工厂
CarFactory返回Car类型,但内部通过工厂方法分发:public Car createCar(String type) { return switch (type) { case "electric-sedan" -> new ElectricSedan(); case "normal-suv" -> new NormalSUV(); default -> throw new IllegalArgumentException(); }; } - 新增
FlyingCar时,只需扩展抽象类并更新工厂分支,不破坏现有调用方
关键点:多态创建流程真正生效的前提
- 客户端必须用抽象类型(抽象类或接口)声明变量,例如
Car car = factory.createCar("electric"); car.drive(); - 具体类构造不可暴露给调用方,所有实例必须经由工厂返回
- 抽象类中
final方法确保一致性,abstract方法留给子类定制,二者共同支撑运行时动态绑定
这样组织,抽象类不是抽象工厂的“组成部分”,而是它所创建产品的骨架;工厂负责“选哪一套”,抽象类负责“这一套长什么样、怎么动”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











