抽象工厂模式用于创建一系列相互关联的对象而不指定具体类,通过抽象产品接口(Button、TextBox)和抽象工厂接口(GUIFactory)解耦组件创建与平台实现,运行时按系统属性动态选择具体工厂(WindowsFactory/MacFactory),符合开闭原则但新增产品需修改所有工厂。

抽象工厂模式的核心作用
抽象工厂模式用于创建一系列相互关联或相互依赖的对象,而无需指定它们的具体类。在跨平台 UI 组件场景中,它能将“创建什么组件”(如按钮、文本框)和“创建哪个平台的组件”(Windows/macOS/Linux)彻底解耦,让客户端代码完全不感知底层实现。
定义抽象产品与抽象工厂接口
先统一各平台 UI 组件的行为契约:
抽象产品接口示例:
interface Button { void render(); }
interface TextBox { void render(); }
抽象工厂接口(关键):
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
所有具体工厂(如 WindowsFactory、MacFactory)都实现该接口,各自返回对应平台的具体组件实例。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
为每个操作系统实现具体工厂与组件
每个子类工厂负责“成套生产”本平台的一组组件,确保风格与行为一致:
- WindowsFactory:返回 WindowsButton、WindowsTextBox,内部调用 Win32 API 或 Swing/AWT 风格适配逻辑
- MacFactory:返回 MacButton、MacTextBox,模拟 Aqua 外观(如圆角、阴影、字体渲染)
- LinuxFactory(可选):适配 GTK 或 Qt 风格,或复用 Swing 的 Metal/LookAndFeel
注意:各具体组件类只依赖抽象产品接口,不直接引用其他平台实现,避免编译期耦合。
运行时动态选择并加载工厂
不硬编码 new MacFactory(),而是根据系统属性自动匹配:
public class Application {
private GUIFactory factory;
private Button button;
private TextBox textBox;
public Application() {
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
factory = new WindowsFactory();
} else if (os.contains("mac")) {
factory = new MacFactory();
} else {
factory = new LinuxFactory();
}
button = factory.createButton();
textBox = factory.createTextBox();
}
public void run() {
button.render(); // 自动调用 WindowsButton.render() 或 MacButton.render()
textBox.render();
}
}
进阶可替换为配置驱动(如读取 config.properties 中的 factory.class=MacFactory),甚至配合 ServiceLoader 实现插件化扩展。
优势与注意事项
✅ 客户端无条件分支,新增操作系统只需加新工厂+组件,符合开闭原则
✅ 各平台组件天然隔离,便于单元测试与独立维护
❌ 工厂接口一旦增加新产品(如 CheckBox),所有已有具体工厂都要修改 —— 这是抽象工厂的固有局限,需权衡是否拆分工厂层级或引入 Builder 模式辅助
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










