抽象工厂模式中,抽象类作为产品族的公共基类定义共性接口与强制实现,具体工厂创建其子类实例并返回抽象类型引用,客户端通过多态调用实际行为;抽象类适用于需共享字段、默认实现或模板方法的场景,而接口更轻量。

抽象类本身不能直接实例化,但可以作为抽象工厂模式中产品族的统一类型声明。抽象工厂不管理抽象类的“创建”,而是负责创建一组具有相同主题、相互协作的具体对象——这些对象的类型通常由抽象类或接口定义。
抽象类在抽象工厂中的角色定位
抽象类在这里主要充当产品族的公共基类,定义通用行为和强制子类实现的抽象方法。它不参与工厂的创建逻辑,而是被具体工厂所“生产”的对象所继承。
- 抽象类(如
Button、Checkbox)声明系列产品的共性接口 - 不同主题的具体类(如
WinButton、MacButton)继承该抽象类并实现细节 - 抽象工厂(如
GUIFactory)定义创建这些抽象类实例的方法签名 - 具体工厂(如
WinFactory、MacFactory)返回对应平台的具体子类实例
典型代码结构示意
以跨平台 GUI 组件为例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
// 抽象产品:按钮(抽象类)
abstract class Button {
public abstract void render();
}
// 具体产品
class WinButton extends Button {
public void render() { System.out.println("Render a Windows button"); }
}
class MacButton extends Button {
public void render() { System.out.println("Render a macOS button"); }
}
// 抽象工厂
interface GUIFactory {
Button createButton(); // 返回抽象类类型
Checkbox createCheckbox(); // 同理,可扩展其他抽象产品
}
// 具体工厂
class WinFactory implements GUIFactory {
public Button createButton() { return new WinButton(); }
public Checkbox createCheckbox() { return new WinCheckbox(); }
}
class MacFactory implements GUIFactory {
public Button createButton() { return new MacButton(); }
public Checkbox createCheckbox() { return new MacCheckbox(); }
}
// 客户端使用(依赖抽象,不关心具体实现)
class Application {
private Button button;
Application(GUIFactory factory) {
this.button = factory.createButton(); // 工厂返回的是抽象类引用,实际是具体子类实例
}
void paint() {
button.render(); // 多态调用,行为由实际类型决定
}
}
为什么不用接口而用抽象类?
当系列产品需要共享代码(如默认实现、字段、构造逻辑)时,抽象类比接口更合适:
- 可在
Button中定义受保护字段(如color、size),供所有子类复用 - 提供模板方法(如
click()调用render()再触发事件),约束流程 - 避免在每个具体类中重复写相同辅助逻辑
关键注意事项
抽象工厂与抽象类协同工作时需注意边界:
- 抽象工厂不“创建抽象类”,只创建继承该抽象类的具体类实例
- 客户端持有的是抽象类引用,运行时绑定到具体子类,体现多态本质
- 抽象类不应包含与工厂职责耦合的逻辑(如自己去 new 工厂或决定创建哪个子类)
- 若产品种类简单且无共享状态/行为,优先用接口;有复用需求再选抽象类
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










