设计模式-抽象工厂模式
抽象工厂模式Abstract Factory提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。使用普通工厂方法每次只能负责生产某单一类型的对象一旦遇到需要“成套搭配”的产品场景极其容易产生配置混乱 最优方案是由抽象工厂定义一整套相关产品的创建规范再由具体的工厂来负责这一整套产品族的具体实现客户端只需要和接口打交道就能打包获取一整套相互兼容的产品。AbstractFactory接口声明了一组用于创建一族产品的方法例如 CreateProductA、CreateProductB每个方法负责创建一种类型的产品。优缺点优点产品族一致性当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象杜绝“品牌混用”导致的兼容性问题极佳的解耦性客户端不仅不用关心对象的具体创建逻辑甚至不知道最终使用的是哪个具体的产品类实现了调用端与产品实现的完全隔离批量切换极其简单修改具体工厂的实例化语句就能在代码中一键切换整个系统的产品风格、运行环境或数据库类型。缺点难以扩展新产品种类如果产品族里需要增加一个全新的产品角色比如原来只有键盘、鼠标现在要新增一个耳机必须修改抽象工厂的底层接口所有实现该接口的具体工厂类全部都要跟着改动严重违背了“开闭原则”类爆炸问题由于系统需要为每一个产品族、每一个产品等级准备对应的接口和具体类前期架构中类的数量会极速成倍膨胀带来较高的阅读与维护成本。举个例子RS工作室给新来的两名程序员小伙伴配置桌面办公装备键盘 鼠标。咱们采购外设一般讲究“生态套装”要么全选极简办公风要么全选机械朋克风。如果混用不仅外观极其别扭各家的驱动程序还得同时装好几个如果不使用抽象工厂模式大家都是在 main 方法里随便 newpublic class Office { public static void main(String[] args) { // 小A想组一台机器 Keyboard k1 new PunkKeyboard(); Mouse m1 new MinimalistMouse(); k1.type(); m1.click(); } }敲击机械朋克键盘咔哒咔哒 点击极简静音鼠标无声轻触...输出结果虽然能用但观察到 小A不小心买成了“朋克风键盘 极简风鼠标”不仅桌面上看起来辣眼睛而且两者驱动不兼容。主要缺点控制不了产品组合的搭配一旦全公司几百人同时配置手一抖就会产生各种奇奇怪怪的“杂牌军”组合。但是使用抽象工厂呢我们将键盘和鼠标死死绑定为一个“产品族”// 1. 定义产品接口 public interface Keyboard { void type(); } public interface Mouse { void click(); } // 2. 朋克风产品族 public class PunkKeyboard implements Keyboard { public void type() { System.out.println(敲击机械朋克键盘咔哒咔哒有劲); } } public class PunkMouse implements Mouse { public void click() { System.out.println(点击朋克鼠标RGB发光炫酷触发); } } // 3. 极简风产品族 public class MinimalistKeyboard implements Keyboard { public void type() { System.out.println(敲击极简键盘巧克力键帽轻柔舒适); } } public class MinimalistMouse implements Mouse { public void click() { System.out.println(点击极简鼠标人体工学静音无声); } } // 4. 抽象工厂规定每个具体工厂必须出产一个键盘和一个鼠标 public interface PeripheralFactory { Keyboard createKeyboard(); Mouse createMouse(); } // 5. 具体工厂A负责专门生产朋克套装 public class PunkFactory implements PeripheralFactory { public Keyboard createKeyboard() { return new PunkKeyboard(); } public Mouse createMouse() { return new PunkMouse(); } } // 6. 具体工厂B负责专门生产极简套装 public class MinimalistFactory implements PeripheralFactory { public Keyboard createKeyboard() { return new MinimalistKeyboard(); } public Mouse createMouse() { return new MinimalistMouse(); } }客户端调用时只需要指定一个具体工厂产出的设备天然配对public class Studio { public static void main(String[] args) { // 行政人员决定今天给新员工配“机械朋克套装” PeripheralFactory factory new PunkFactory(); // 程序员只管从工厂领设备绝对不会领错品牌 Keyboard myKeyboard factory.createKeyboard(); Mouse myMouse factory.createMouse(); myKeyboard.type(); myMouse.click(); } }敲击机械朋克键盘咔哒咔哒有劲 点击朋克鼠标RGB发光炫酷触发全程通过PunkFactory统一打包出产如果有一天老板决定全工作室换成极简风只需将new PunkFactory()改为new MinimalistFactory()后续所有生成外设的代码一字不改完美实现成套组装与一键切换。抽象工厂模式的核心术语与演进产品等级结构Product Class即产品的类型。比如“键盘”是一个产品等级“鼠标”是另一个产品等级。在代码里就是它们各自的顶级接口。产品族Product Family由同一个具体工厂生产位于不同产品等级结构中的一组产品。比如“朋克风键盘 朋克风鼠标”共同构成了“朋克产品族”。退化为工厂方法当抽象工厂类里只含有一个创建产品的方法时即只有一个产品等级比如只生产键盘抽象工厂模式就自动退化成了普通的工厂方法模式。搭配单例模式使用在实际开发中具体工厂类比如上面的PunkFactory在全系统中通常只需要存在一个实例就足够了因此具体工厂经常结合单例模式Singleton共同实现。适用场景多套 UI 皮肤/主题切换例如跨平台桌面软件需要同时支持 Windows 和 macOS 风格的控件按钮、文本框、滚动条游戏系统内的套装功能火系护甲火系武器 vs 冰系护甲冰系武器多数据库兼容架构系统需要同时兼容 MySQL 和 Oracle由于数据库连接Connection、命令操作Command、结果集ResultSet必须彼此配套极其适合用抽象工厂统一生产硬件设备生态套件比如不同品牌的智能家居控制系统苹果 HomeKit 协议芯片组件 vs 小米米家协议组件多环境基础组装在软件工程中针对开发环境Dev、测试环境Test和生产环境Prod分别成套提供不同的日志记录器、缓存解析器与网络请求客户端。

相关新闻

Mac安装Codex桌面端:从芯片确认到性能优化

Mac安装Codex桌面端:从芯片确认到性能优化

1. Codex 桌面端简介与下载准备 Codex 是 OpenAI 推出的 AI 编程助手,其桌面端应用为开发者提供了更强大的本地化工作支持。对于 Mac 用户而言,安装过程需要特别注意芯片架构差异和系统兼容性。以下是安装前的关键准备工作: 芯片架构确认 …

2026/10/9 1:08:56 阅读更多 →
SASAM模块:轻量化多尺度注意力机制在CV中的应用

SASAM模块:轻量化多尺度注意力机制在CV中的应用

1. 项目概述:SASAM模块的核心价值在计算机视觉领域,注意力机制已经成为提升模型性能的标配组件。但传统注意力模块往往面临两个痛点:计算复杂度高导致推理速度下降,以及单一尺度特征处理难以适应不同大小的目标。SASAM&#xff08…

2026/10/7 14:23:40 阅读更多 →
x86汇编中CALL与RET指令的深度解析

x86汇编中CALL与RET指令的深度解析

1. 汇编语言中的CALL与RET指令解析在x86汇编语言中,CALL和RET是一对相辅相成的指令组合,构成了子程序调用的基础机制。这对指令的工作方式直接影响着程序的控制流和栈管理,理解它们的底层原理是掌握汇编编程的关键。1.1 CALL指令的本质CALL指…

2026/10/11 2:09:56 阅读更多 →

最新新闻

OAM相位图生成与拓扑荷数提取实战指南

OAM相位图生成与拓扑荷数提取实战指南

简介:本资源是一套面向电磁波物理、光通信与OAM前沿研究方向的可视化分析资料包,适用于高校研究生、光学工程研究人员及通信领域工程师,用于深入理解涡旋电磁波的相位结构与场强分布特性。压缩包共19个文件,含8个.dat数据文件&…

2026/10/13 7:10:57 阅读更多 →
多租户LLM应用Prompt隔离实战:防串味、防泄露的完整指南

多租户LLM应用Prompt隔离实战:防串味、防泄露的完整指南

做过多租户LLM应用的人,大概率遇到过一种极其折磨人的故障:系统日志一切正常、模型接口也没有报错,但某个租户突然反馈“AI好像变成了别人家的客服”——回答里出现了另一家公司的名称,甚至把别家的产品报价当成自己的给出去。这种…

2026/10/13 7:10:57 阅读更多 →
Spring Boot接口版本控制实战:自定义注解实现v1/v2共存

Spring Boot接口版本控制实战:自定义注解实现v1/v2共存

做接口开发的朋友,应该都经历过这种尴尬:接口上线跑得好好的,某天产品说“加个字段”,你顺手把老接口改了,结果第二天第三方对接方打来电话——“你接口怎么挂了?”要命的是,对方根本不关心你改…

2026/10/13 7:10:57 阅读更多 →
ngx-bootstrap Tabs 键盘导航禁用:`TabsetConfig.isKeysAllowed` 配置与源码原理深度解析

ngx-bootstrap Tabs 键盘导航禁用:`TabsetConfig.isKeysAllowed` 配置与源码原理深度解析

UI组件前端 【免费下载链接】ngx-bootstrap Fast and reliable Bootstrap widgets in Angular (supports Ivy engine) 项目地址: https://gitcode.com/gh_mirrors/ng/ngx-bootstrap 点击查看 免费下载 本篇技术指南围绕 ngx-bootstrap Tabs 组件中的“禁用键盘导航…

2026/10/13 7:10:57 阅读更多 →
CodeBuddy实测:把AI编程助手用出工程级效率的关键技巧

CodeBuddy实测:把AI编程助手用出工程级效率的关键技巧

不管你是刚听说 AI 编程助手、准备换工具的老手,还是已经在用但觉得“没想象中好用”的开发者,这篇都值得看完。我花了大概一个月时间,把自己日常的编码、Debug、重构流程全部过了一遍 CodeBuddy,从 IDE 插件安装到拿它去改一个老…

2026/10/13 7:10:57 阅读更多 →
pandas-ta 实战:量化技术指标计算与回测流水线集成

pandas-ta 实战:量化技术指标计算与回测流水线集成

简介:Pandas TA 是一个面向 Python 3 的 Pandas 扩展库,专为量化交易、金融数据分析与股票市场研究场景设计,适合具备一定 Pandas 基础、希望快速调用技术指标的开发者与交易策略研究者。它内置 120 多个技术分析指标与实用函数,涵…

2026/10/13 7:09:57 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →