抽象类在工厂模式中承担“产品规范”与“共性封装”双重角色:作为抽象产品基类统一接口和行为契约,提供默认实现与状态字段,支撑多态调用与类型安全,同时通过继承约束具体产品实现,配合抽象工厂实现层级解耦。

抽象类在工厂模式中主要承担“产品规范”和“共性封装”双重角色,它不是用来直接实例化的,而是作为具体产品的统一基类,让工厂能返回类型安全、行为一致的对象。
抽象类作为产品基类统一接口
工厂创建的对象必须有共同行为契约,抽象类比接口多出默认实现和状态字段能力,适合定义产品共用逻辑。比如所有数据库连接都需初始化、校验、关闭,这些可放在抽象类里,子类只专注差异部分。
- 定义抽象产品类,声明抽象方法(如 connect()、execute()),同时提供 protected 字段或 final 方法(如连接超时配置、日志模板)
- 具体产品类(MySQLConnection、PostgreSQLConnection)继承该抽象类,实现各自逻辑
- 工厂方法的返回类型直接声明为该抽象类,调用方拿到的就是类型明确、可多态使用的对象
抽象工厂类配合抽象产品形成层级解耦
当系统需要成套产品(如一套UI组件:Button + TextField),抽象工厂本身也常设计为抽象类,而非接口——这样可复用通用校验、资源管理或模板方法。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 抽象工厂类定义多个抽象创建方法,返回对应抽象产品(如 createButton(): AbstractButton、createTextField(): AbstractTextField)
- 具体工厂(WinFactory、MacFactory)继承它,分别返回 WinButton、MacButton 等具体子类
- 客户端只依赖抽象工厂和抽象产品,完全 unaware 具体实现,切换风格只需替换工厂实例
工厂内部用抽象类约束返回类型安全
无论是简单工厂、工厂方法还是抽象工厂,只要返回对象,就应以抽象类为编译期类型。这避免了强制转型,也防止客户端误调用具体类特有方法。
立即学习“Java免费学习笔记(深入)”;
- 例如工厂方法中:return new ConcreteProductA(); 的返回值类型写成 AbstractProduct,而非 Object 或具体类
- 若用反射创建(如 Class.forName(...).getDeclaredConstructor().newInstance()),也应立即向上转型为抽象类类型,保证类型一致性
- 编译器会检查所有分支是否都返回该抽象类或其子类,从源头杜绝类型错误
注意抽象类与接口的选择边界
不是所有场景都该用抽象类。若产品间纯行为契约、无共享状态或默认逻辑,接口更轻量;但一旦涉及构造流程控制(如模板方法)、共用字段(如连接池引用)、或需强制子类调用父类初始化,抽象类就是更自然的选择。
- 抽象类适合“是什么+怎么做一部分”,接口适合“能做什么”
- Java 不支持多继承,所以一个具体产品只能继承一个抽象类,但可实现多个接口——设计时需权衡扩展灵活性
- 抽象工厂返回抽象类,不等于禁止返回接口;实际项目中常混合使用:工厂返回抽象类,该类再实现若干接口

















