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

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 控件

✅ 使用建议

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

http://www.xdnf.cn/news/171.html

相关文章:

  • 【含文档+PPT+源码】基于Python的股票数据可视化及推荐系统的设计与实现
  • Oracle 11g通过dg4odbc配置dblink连接PostgreSQL
  • 从头学 | 目标函数、梯度下降相关知识笔记(一)
  • 边缘计算网关组态功能的定义
  • 阀门轴承电动车工件一键精修软件
  • vue2.6.12 安装babel 以使用 可选链 ?. 和空值合并 ??
  • 【Vue3代理机制详解:从原理到实践】
  • 医疗行业如何构建合成数据平台?——技术、合规与实践全景
  • Jenkins的使用及Pipeline语法讲解
  • 简易 Python 爬虫实现,10min可完成带效果源码
  • LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 网络socket
  • Linux和Ubuntu的驱动适配情况
  • 数据结构-Map和Set
  • Oracle日志系统之附加日志
  • 学习海康VisionMaster之中线查找
  • 新手蓝桥杯冲击国一练习题单(四)
  • C++ 二叉搜索树
  • LINUX418 加载YUM源 wireshark ping程序 解析
  • 亚远景-ASPICE评估标准与车企供应商准入要求的关联性
  • 串口通信实战:从寄存器操作到数据处理的完全指南
  • 人像面部关键点检测
  • 力扣刷题Day 20:柱状图中最大的矩形(84)
  • FPGA HR Bank如何支持ODELAY问题分析
  • Yocto项目实战教程 · 第4章:4.3小节-层
  • 七、LangChain Tool类参数对接机制解析:基于Pydantic的类型安全与流程实现
  • JavaScript 核心特性完全指南
  • Python如何助力区块链网络安全?从攻击防范到智能合约审计
  • Jenkins 多分支管道
  • uniapp打包报错,
  • LeetCode -- Flora -- edit 2025-04-17