新闻详情

新闻详情

首页 / 资讯中心 / 详情

抽象工厂模式:创建产品族

发布时间:2026/9/26 11:43:46来源:尧图网络
抽象工厂模式:创建产品族
抽象工厂模式创建产品族工厂方法模式解决的是“一个产品等级结构”的创建问题。比如支付方式只有Payment一种产品接口每个具体工厂创建一个具体支付实现。但现实中有另一类场景系统需要创建一系列相关或相互依赖的对象而且这些对象必须成套使用。比如一个跨平台 UI 库Windows 风格下需要 Windows 按钮和 Windows 复选框Mac 风格下需要 Mac 按钮和 Mac 复选框。你不能在 Windows 风格里混用 Mac 复选框否则界面就乱了。这种“一系列相关对象”就是产品族。抽象工厂模式专门用来创建产品族。定义抽象工厂模式提供一个接口用于创建一系列相关或相互依赖的对象而无需指定它们具体的类。简单说工厂方法生产一个产品抽象工厂生产一套产品。结构抽象工厂模式包含五个角色抽象产品 A、B…定义同一产品族中不同产品的接口。具体产品 A1、B1…实现抽象产品属于同一个产品族。抽象工厂声明创建产品族中所有产品的方法。具体工厂实现抽象工厂创建同一个产品族的具体产品。客户端只依赖抽象工厂和抽象产品不接触具体类。代码示例跨平台 UI假设我们要开发一个跨平台 UI 库支持 Windows 和 Mac 两种风格。每种风格都有按钮和复选框。抽象产品 A按钮publicinterfaceButton{voidrender();}抽象产品 B复选框publicinterfaceCheckbox{voidcheck();}Windows 产品族publicclassWindowsButtonimplementsButton{Overridepublicvoidrender(){System.out.println(渲染 Windows 按钮);}}publicclassWindowsCheckboximplementsCheckbox{Overridepublicvoidcheck(){System.out.println(勾选 Windows 复选框);}}Mac 产品族publicclassMacButtonimplementsButton{Overridepublicvoidrender(){System.out.println(渲染 Mac 按钮);}}publicclassMacCheckboximplementsCheckbox{Overridepublicvoidcheck(){System.out.println(勾选 Mac 复选框);}}抽象工厂publicinterfaceGUIFactory{ButtoncreateButton();CheckboxcreateCheckbox();}具体工厂publicclassWindowsFactoryimplementsGUIFactory{OverridepublicButtoncreateButton(){returnnewWindowsButton();}OverridepublicCheckboxcreateCheckbox(){returnnewWindowsCheckbox();}}publicclassMacFactoryimplementsGUIFactory{OverridepublicButtoncreateButton(){returnnewMacButton();}OverridepublicCheckboxcreateCheckbox(){returnnewMacCheckbox();}}客户端publicclassApplication{privateButtonbutton;privateCheckboxcheckbox;publicApplication(GUIFactoryfactory){buttonfactory.createButton();checkboxfactory.createCheckbox();}publicvoidrender(){button.render();checkbox.check();}publicstaticvoidmain(String[]args){// 切换产品族只需换一个工厂GUIFactoryfactorynewWindowsFactory();ApplicationappnewApplication(factory);app.render();}}客户端只依赖GUIFactory、Button、Checkbox。要换成 Mac 风格只需要把WindowsFactory换成MacFactory其他代码一行不用改。与工厂方法的区别这是最容易混淆的地方。用一句话区分工厂方法一个抽象产品多个具体产品每个具体产品对应一个具体工厂。抽象工厂多个抽象产品多个产品族每个具体工厂负责创建一个产品族。对比维度工厂方法抽象工厂产品等级结构一个多个产品族无此概念有强调成套使用抽象工厂的方法数一个多个扩展方向新增产品容易新增产品族容易新增产品等级困难开闭原则对产品扩展开放对产品族扩展开放对产品等级修改关闭典型场景日志框架、支付方式跨平台 UI、数据库访问层抽象工厂的“开闭原则”是双向的新增一个产品族比如加 Linux 风格只需新增LinuxFactory和相关产品类不用改已有代码。✅新增一个产品等级比如加一个TextField需要修改GUIFactory接口和所有具体工厂。❌所以抽象工厂适合“产品族稳定、产品等级会扩展”的场景。如果产品等级经常变抽象工厂就不合适。另一个经典例子数据库访问层抽象工厂在数据库访问层非常常见。假设系统要支持 MySQL 和 Oracle每种数据库都有连接、命令、事务等对象。// 抽象产品publicinterfaceConnection{voidconnect();}publicinterfaceCommand{voidexecute(Stringsql);}// MySQL 产品族publicclassMySQLConnectionimplementsConnection{...}publicclassMySQLCommandimplementsCommand{...}// Oracle 产品族publicclassOracleConnectionimplementsConnection{...}publicclassOracleCommandimplementsCommand{...}// 抽象工厂publicinterfaceDatabaseFactory{ConnectioncreateConnection();CommandcreateCommand();}// 具体工厂publicclassMySQLFactoryimplementsDatabaseFactory{...}publicclassOracleFactoryimplementsDatabaseFactory{...}客户端通过DatabaseFactory创建连接和命令不关心底层是 MySQL 还是 Oracle。切换数据库时只需换一个工厂实现。优点保证产品族一致性。同一个工厂创建的产品天然属于同一个族不会出现 Windows 按钮配 Mac 复选框的情况。客户端与具体产品解耦。客户端只依赖抽象工厂和抽象产品具体类完全隐藏。符合开闭原则产品族维度。新增产品族时不需要修改已有代码。集中管理产品族。产品族的切换只需换一个具体工厂。缺点扩展产品等级困难。新增一个产品接口要修改抽象工厂和所有具体工厂违反开闭原则。抽象工厂接口庞大。产品族中产品越多抽象工厂的方法就越多接口会变得臃肿。类数量增加。每个产品族都要一套具体产品类和一个具体工厂类的数量增长很快。适用场景系统需要创建多个相关对象且它们必须成套使用。系统需要支持多种“风格”或“平台”且风格之间相互独立。客户端不关心具体产品类只依赖抽象接口。产品族相对稳定产品等级可能扩展。典型应用跨平台 UI 库Windows、Mac、Linux 风格。数据库访问层MySQL、Oracle、PostgreSQL。游戏中的不同种族人族、兽族、神族各有自己的建筑和兵种。不同主题的报表生成器。在 JDK 和 Spring 中的体现JDK 中的抽象工厂javax.xml.parsers.DocumentBuilderFactory是一个抽象工厂。它提供newDocumentBuilder()创建DocumentBuilder还提供newDocument()等创建相关对象。具体工厂由系统属性或服务提供者决定客户端不直接new。java.sql.Connection可以看作抽象工厂它提供createStatement()、prepareStatement()等方法返回同一数据库产品族中的命令对象。Spring 中的体现Spring 的BeanFactory体系可以看作抽象工厂。BeanFactory是抽象工厂XmlBeanFactory、AnnotationConfigApplicationContext是具体工厂它们负责创建整个应用所需的各种 Bean。客户端通过getBean()获取对象不关心创建细节。不过 Spring 的 BeanFactory 比经典抽象工厂更灵活它不限定产品族而是根据配置动态创建任意类型的 Bean。总结抽象工厂模式的核心是产品族。它把一组相关对象的创建集中到一个工厂接口中保证客户端拿到的是同一族的产品。工厂方法关注“一个产品的创建”抽象工厂关注“一族产品的创建”。选择哪种工厂模式取决于你的产品结构只有一个产品等级且需要扩展产品 → 工厂方法。有多个产品等级需要成套创建 → 抽象工厂。产品很少且稳定 → 简单工厂。理解产品族和产品等级这两个概念就能准确判断什么时候该用抽象工厂。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

WorkBuddy + Flask + SQLite:快速搭建日更站点的实战指南 2026/9/26 12:25:41

WorkBuddy + Flask + SQLite:快速搭建日更站点的实战指南

1. 为什么我选择 WorkBuddy Flask SQLite 这套组合1.1 从“想做个站”到“真的跑起来”之间差了什么很多人第一次冒出“自己建个站”的念头,往往是因为看到了某个很酷的页面,或者手里有一批想展示的数据。但真动手的时候,问题就来了&#x…

阅读更多 →
STM32驱动红外PM2.5传感器实战:硬件滤波、串口抗干扰与数据校验 2026/9/26 12:25:34

STM32驱动红外PM2.5传感器实战:硬件滤波、串口抗干扰与数据校验

1. 项目概述:为什么STM32连接红外PM2.5传感器不是“接上线就完事”的简单活你手头有一块STM32F103C8T6最小系统板,淘宝上刚拆封的PMS5003或PMS7003红外PM2.5传感器模块,杜邦线一插,串口一连,串口助手里却只刷出乱码、空…

阅读更多 →
异步任务调度器架构实践:从线程池到协程调度与超时控制 2026/9/26 12:25:34

异步任务调度器架构实践:从线程池到协程调度与超时控制

前几天我们内部一个叫“ax”的调度模块被新同事翻出来追问了好几次,起因是热词榜上突然挂了个“ax调度”,点进去发现大家说的其实是一类很朴素的问题:一堆异步任务挤在一起,到底怎么排、怎么跑、怎么在超时前收场。我仔细看了一下…

阅读更多 →
流量分析实战:从Wireshark抓包到异常研判的完整方法 2026/9/26 12:25:28

流量分析实战:从Wireshark抓包到异常研判的完整方法

上周帮朋友排查一台业务服务器的问题,现象是高峰期CPU直接飙到90%以上,应用侧日志翻来覆去看不出异常。后来我在入口交换机做了个端口镜像,抓了二十分钟流量,真相很快浮出水面——不是应用代码的锅,而是一段异常重试逻…

阅读更多 →
SpringBoot+Vue外卖配送管理系统:从数据库导入到前后端联调避坑指南 2026/9/26 12:25:28

SpringBoot+Vue外卖配送管理系统:从数据库导入到前后端联调避坑指南

简介:基于SpringBootVue的外卖配送管理系统源码与数据库,专为计算机专业毕设及Java后端学习者设计,覆盖前后端分离的完整业务场景。系统按功能模块划分:用户信息管理、优惠券领取、通知提醒、银行卡/微信/支付宝多支付方式&#x…

阅读更多 →
OpenClaw系列---【OpenClaw接入飞书:插件配置与权限骨架怎么搭?】 2026/9/26 12:25:21

OpenClaw系列---【OpenClaw接入飞书:插件配置与权限骨架怎么搭?】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉