当前位置: 首页 > news >正文

23种设计模式-创建型模式之抽象工厂模式(Java版本)

Java 抽象工厂模式(Abstract Factory Pattern)详解

🌟 什么是抽象工厂模式?

抽象工厂模式是工厂方法模式的升级版,提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。


🧠 使用场景

  • 系统需要创建多个系列的产品对象
  • 系统需要与多个产品系列中的一个进行交互
  • 需要保证产品对象之间的兼容性(例如 UI 样式组件)

🏗️ 模式结构

  • AbstractFactory(抽象工厂)
  • ConcreteFactory(具体工厂)
  • AbstractProduct(抽象产品)
  • ConcreteProduct(具体产品)
  • Client(客户端)

✅ 示例:跨平台 UI 工厂(Windows & Mac)

抽象产品接口

public interface Button {void paint();
}public interface TextField {void render();
}

具体产品实现

public class WindowsButton implements Button {public void paint() {System.out.println("Rendering Windows Button");}
}public class MacButton implements Button {public void paint() {System.out.println("Rendering Mac Button");}
}public class WindowsTextField implements TextField {public void render() {System.out.println("Rendering Windows TextField");}
}public class MacTextField implements TextField {public void render() {System.out.println("Rendering Mac TextField");}
}

抽象工厂接口

public interface GUIFactory {Button createButton();TextField createTextField();
}

具体工厂实现

public class WindowsFactory implements GUIFactory {public Button createButton() {return new WindowsButton();}public TextField createTextField() {return new WindowsTextField();}
}public class MacFactory implements GUIFactory {public Button createButton() {return new MacButton();}public TextField createTextField() {return new MacTextField();}
}

客户端调用

public class Application {private Button button;private TextField textField;public Application(GUIFactory factory) {button = factory.createButton();textField = factory.createTextField();}public void render() {button.paint();textField.render();}public static void main(String[] args) {GUIFactory factory = new WindowsFactory(); // 可替换为 MacFactoryApplication app = new Application(factory);app.render();}
}

🧩 优点

  • 符合开闭原则,易于扩展新产品族
  • 保证产品之间的兼容性
  • 封装了对象的创建过程,客户端无需关心细节

⚠️ 缺点

  • 每增加一个产品族都需要修改工厂接口,系统复杂度增加
  • 不易支持“新产品等级结构”的变化

🆚 与工厂方法的区别

特点工厂方法抽象工厂
创建对象数一类产品一族产品
类数量工厂类较少工厂类更多
产品间的关联不强调关联强调一族产品间的一致性
示例创建单一 Logger创建一整套 UI 控件

✅ 使用建议

当产品对象有“系列”概念,且客户端必须使用同一产品族中的对象时,抽象工厂是最合适的选择。

相关文章:

  • 从零到一:管理系统设计新手如何快速上手?
  • 掌握MySQL:基本查询指令与技巧
  • Kafka消费者端重平衡流程
  • 《软件设计师》复习笔记(14.2)——统一建模语言UML、事务关系图
  • 遨游科普:三防平板除了三防特性?还能实现什么功能?
  • 工业触摸显示器助力智慧工业实验室发展
  • OpenStack Yoga版安装笔记(22)Swift笔记20250418
  • vue3 Element-plus修改内置样式复现代码
  • (7)VTK C++开发示例 --- 使用交互器
  • Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇
  • 【dify实战】agent结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载
  • 什么是线程安全
  • 软件详细设计说明书模板
  • 《Learning Langchain》阅读笔记3-基于 Gemini 的 Langchain如何从LLMs中获取特定格式
  • 【Mamba】MambaVision论文阅读
  • MCP(Model Context Protocol 模型上下文协议)科普
  • 【数据融合实战手册·实战篇】二维赋能三维的5种高阶玩法:手把手教你用Mapmost打造智慧城市标杆案例
  • STM32F407的引脚说明
  • C++ `shared_ptr` 多线程使用
  • OrangePi 5 Pro vs OrangePi AI Pro 详细对比分析
  • 海口市美兰区委副书记、区长吴升娇去世,终年41岁
  • 上海地铁18号线二期长轨贯通,预计今年年底开通初期运营
  • 巡视杭州市工作动员会召开,市长姚高员表态
  • 经济日报:扩大内需与扩大开放并行不悖
  • 新华书店成立全民阅读研究院,李敬泽任专家委员会主任
  • 云南景洪回应“游客打车遭临时加价并拒载”:对司机顶格罚款500元并停运学习