抽象类是抽象工厂模式中产品族的统一类型声明,工厂返回抽象类而非具体实现,使客户端仅依赖抽象类型调用行为,实现创建与使用的解耦;还可通过模板方法固化算法骨架,提升扩展性。

抽象类本身不直接参与抽象工厂模式的“解耦创建”,但它是该模式中产品族的重要组成部分——抽象工厂通过返回抽象类(或接口)类型的对象,把具体实现类完全隐藏起来,从而实现创建逻辑与使用逻辑的解耦。
抽象类作为产品族的统一类型声明
在抽象工厂中,抽象类常被用作一组相关产品(如 WindowsButton、MacButton)的共同父类。工厂不返回具体类,而是返回这个抽象类,调用方只依赖抽象类定义的行为,无需知道实际是哪个子类。
- 例如定义 abstract class Button,包含 render() 抽象方法;不同平台的具体按钮(WindowsButton、MacButton)继承它
- 抽象工厂(如 GUIFactory)声明方法 createButton(): Button,返回的是 Button 抽象类,而非任意具体实现
- 客户端代码只面向 Button 编程,切换工厂(WindowsFactory → MacFactory)时,无需修改任何使用按钮的代码
抽象工厂返回抽象类,屏蔽具体实现细节
工厂内部 new 出具体子类,但对外暴露的是抽象类引用——这正是解耦的关键:创建者知道具体类型,使用者只知道抽象类型。
- 工厂实现里写 return new WindowsButton();,但签名是 Button createButton()
- 调用方拿到 Button btn = factory.createButton();,调用 btn.render() 即可,完全不知道背后是 Windows 还是 Mac 实现
- 新增产品(如 LinuxButton)只需扩展子类 + 修改对应工厂,不影响现有客户端和抽象层
配合模板方法,让抽象类控制算法骨架
抽象类还可定义模板方法,把部分流程固化(如 click() 包含 press() → animate() → release()),而将差异步骤(如 press())留给子类实现。抽象工厂确保返回的对象具备完整可运行行为,且扩展性好。
- 抽象类中 final void click() { press(); animate(); release(); }
- 子类只重写 press() 和 release(),适配各自平台逻辑
- 工厂返回的任意 Button 子类实例,调用 click() 都能正确执行完整流程
注意:抽象类 vs 接口的选择
如果产品之间共享代码(如默认动画逻辑、公共字段),用抽象类更合适;如果只是行为契约,接口更灵活(支持多实现)。抽象工厂可返回抽象类或接口,本质一致——关键是返回抽象类型,而非具体类。
- Java 8+ 接口可有 default 方法,缩小了与抽象类的差距
- 若需构造器参数、非 public 成员或 protected 方法,抽象类仍是更好选择
- 无论选哪种,工厂返回抽象类型,才是解耦的核心
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











