Java 23 种设计模式:从踩坑到精通 | 番外:抽象工厂模式 —— 物流产品族生产实战

发布时间:2026/9/28 19:46:04

Java 23 种设计模式:从踩坑到精通 | 番外:抽象工厂模式 —— 物流产品族生产实战
Java 23 种设计模式从踩坑到精通 | 番外抽象工厂模式 —— 物流产品族生产实战摘要抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。它关注“产品族”——一组必须配套使用的产品对象。本文结合智能物流中“不同物流渠道国内/国际生产配套的运输工具和单据”的场景完整展示抽象工厂的实现并与工厂方法深度对比帮你掌握“产品族成套创建”的设计精髓。《Java 23 种设计模式从踩坑到精通》开篇系列介绍与目录 正篇抽象工厂 Abstract Factory —— 产品族创建如何避免“一锅粥” 当前番外 · 抽象工厂模式 × 物流产品族生产 返回系列总目录1. 物流产品族生产的痛点物流平台同时支持国内物流和国际物流两大业务线。每条业务线都需要配套的运输工具和物流单据——国内物流用厢式货车 国内运单国际物流用全货机 国际空运提单。如果运输工具和单据不匹配如国内运单配国际货机那就是生产事故。更麻烦的是如果未来新增“冷链物流”业务线需要冷链车 温控记录单用工厂方法模式会创建大量工厂类且无法保证运输工具和单据的配套关系。抽象工厂模式确保同一个工厂生产的产品天然配套。2. 抽象工厂 UML物流产品族场景3. 完整源码实现3.1 抽象产品A运输工具/** * 抽象产品A运输工具 */publicinterfaceTransportVehicle{voidloadCargo();voidstartTransport();StringgetVehicleInfo();}3.2 抽象产品B物流单据/** * 抽象产品B物流单据 */publicinterfaceLogisticsDocument{voidgenerate();voidprint();StringgetDocumentInfo();}3.3 具体产品A1国内运输车辆publicclassDomesticTruckimplementsTransportVehicle{OverridepublicvoidloadCargo(){System.out.println( 厢式货车正在装载国内包裹...);System.out.println( → 装载方式人工搬运 传送带);System.out.println( → 最大载重5吨);}OverridepublicvoidstartTransport(){System.out.println( 厢式货车已出发行驶在国内高速公路上...);}OverridepublicStringgetVehicleInfo(){return国内运输车辆 [厢式货车 4.2米];}}3.4 具体产品A2国际运输工具publicclassInternationalCargoPlaneimplementsTransportVehicle{OverridepublicvoidloadCargo(){System.out.println( 全货机正在装载国际货物...);System.out.println( → 装载方式集装板 叉车);System.out.println( → 最大载重120吨);System.out.println( → 已通过海关安检);}OverridepublicvoidstartTransport(){System.out.println(✈️ 全货机已起飞执行国际航线运输...);}OverridepublicStringgetVehicleInfo(){return国际运输工具 [波音747F全货机];}}3.5 具体产品B1国内运单publicclassDomesticWaybillimplementsLogisticsDocument{privateStringwaybillNo;publicDomesticWaybill(){this.waybillNoDWSystem.currentTimeMillis();}Overridepublicvoidgenerate(){System.out.println( 正在生成国内运单...);System.out.println( → 运单号waybillNo);System.out.println( → 包含信息收寄件人、重量、费用、保价);}Overridepublicvoidprint(){System.out.println(️ 正在打印国内快递面单热敏纸...);}OverridepublicStringgetDocumentInfo(){return国内运单 [waybillNo];}}3.6 具体产品B2国际空运提单publicclassInternationalAirWaybillimplementsLogisticsDocument{privateStringawbNo;publicInternationalAirWaybill(){this.awbNoAWBSystem.currentTimeMillis();}Overridepublicvoidgenerate(){System.out.println( 正在生成国际空运提单...);System.out.println( → 提单号awbNo);System.out.println( → 包含信息发货人/收货人、HS编码、原产地、报关信息);System.out.println( → 已通过IATA审核);}Overridepublicvoidprint(){System.out.println(️ 正在打印国际空运提单一式三联...);}OverridepublicStringgetDocumentInfo(){return国际空运提单 [awbNo];}}3.7 抽象工厂物流工厂接口publicinterfaceLogisticsFactory{TransportVehiclecreateVehicle();LogisticsDocumentcreateDocument();}3.8 具体工厂1国内物流工厂publicclassDomesticLogisticsFactoryimplementsLogisticsFactory{OverridepublicTransportVehiclecreateVehicle(){System.out.println( 国内物流工厂生产国内运输车辆...);returnnewDomesticTruck();}OverridepublicLogisticsDocumentcreateDocument(){System.out.println( 国内物流工厂生产国内运单...);returnnewDomesticWaybill();}}3.9 具体工厂2国际物流工厂publicclassInternationalLogisticsFactoryimplementsLogisticsFactory{OverridepublicTransportVehiclecreateVehicle(){System.out.println( 国际物流工厂生产国际货机...);returnnewInternationalCargoPlane();}OverridepublicLogisticsDocumentcreateDocument(){System.out.println( 国际物流工厂生产国际空运提单...);returnnewInternationalAirWaybill();}}3.10 客户端物流系统publicclassLogisticsSystem{publicvoidprocessOrder(StringorderType){System.out.println(\n═.repeat(70));System.out.println(【订单处理】订单类型(domestic.equals(orderType)?国内物流:国际物流));System.out.println(═.repeat(70));LogisticsFactoryfactory;if(domestic.equals(orderType)){factorynewDomesticLogisticsFactory();}else{factorynewInternationalLogisticsFactory();}TransportVehiclevehiclefactory.createVehicle();LogisticsDocumentdocumentfactory.createDocument();System.out.println(\n--- 开始执行物流流程 ---);document.generate();document.print();System.out.println();vehicle.loadCargo();vehicle.startTransport();System.out.println(\n--- 物流流程执行完毕 ---);System.out.println(使用产品vehicle.getVehicleInfo() document.getDocumentInfo());}publicstaticvoidmain(String[]args){System.out.println( 抽象工厂模式智能物流产品族生产 );LogisticsSystemsystemnewLogisticsSystem();system.processOrder(domestic);system.processOrder(international);}}4. 运行结果 抽象工厂模式智能物流产品族生产 ══════════════════════════════════════════════════════════════════ 【订单处理】订单类型国内物流 ══════════════════════════════════════════════════════════════════ 国内物流工厂生产国内运输车辆... 国内物流工厂生产国内运单... --- 开始执行物流流程 --- 正在生成国内运单... → 运单号DW1705123456789 → 包含信息收寄件人、重量、费用、保价 ️ 正在打印国内快递面单热敏纸... 厢式货车正在装载国内包裹... → 装载方式人工搬运 传送带 → 最大载重5吨 厢式货车已出发行驶在国内高速公路上... --- 物流流程执行完毕 --- 使用产品国内运输车辆 [厢式货车 4.2米] 国内运单 [DW1705123456789] ══════════════════════════════════════════════════════════════════ 【订单处理】订单类型国际物流 ══════════════════════════════════════════════════════════════════ 国际物流工厂生产国际货机... 国际物流工厂生产国际空运提单... --- 开始执行物流流程 --- 正在生成国际空运提单... → 提单号AWB1705123456790 → 包含信息发货人/收货人、HS编码、原产地、报关信息 → 已通过IATA审核 ️ 正在打印国际空运提单一式三联... 全货机正在装载国际货物... → 装载方式集装板 叉车 → 最大载重120吨 → 已通过海关安检 ✈️ 全货机已起飞执行国际航线运输... --- 物流流程执行完毕 --- 使用产品国际运输工具 [波音747F全货机] 国际空运提单 [AWB1705123456790]5. 核心角色回顾角色职责对应代码AbstractFactory声明创建产品族的方法LogisticsFactoryConcreteFactory实现具体产品族的创建DomesticLogisticsFactory/InternationalLogisticsFactoryAbstractProduct定义产品的抽象接口TransportVehicle/LogisticsDocumentConcreteProduct实现具体产品DomesticTruck、InternationalCargoPlane等Client依赖抽象工厂使用产品族LogisticsSystem6. 抽象工厂 vs 工厂方法对比项抽象工厂工厂方法创建对象数量一组相关产品产品族单个产品工厂方法数多个创建方法一个创建方法产品关系有配套关系必须一起使用相互独立扩展产品族符合 OCP新增工厂子类无此概念扩展产品类型违反 OCP需修改所有工厂符合 OCP新增工厂子类7. 抽象工厂的“坑”与优化问题解决方案新增产品类型需修改所有工厂慎用在产品等级结构不稳定的场景工厂类数量多按业务线拆分不要为一个产品族创建过多产品类型无法混搭产品如果需要混搭考虑退化到工厂方法 组合8. 六大设计原则体现原则体现单一职责每个工厂只负责一个产品族开闭原则新增产品族符合 OCP新增产品类型违反 OCP里氏替换所有产品族可替换抽象工厂和抽象产品依赖倒置客户端依赖抽象工厂和抽象产品接口隔离工厂接口只定义必要的创建方法迪米特法则客户端只与抽象工厂交互附 抽象工厂 UML源码物流产品族场景startuml title Java 23 种设计模式从踩坑到精通 footer 折哥 | 智能物流与Java实战 1. 全局样式配置 skinparam backgroundColor #FEFEFE skinparam shadowing false skinparam classBorderColor #333333 skinparam classFontColor #1A1A1A skinparam classFontSize 14 skinparam noteFontSize 12 skinparam noteFontColor #555555 skinparam arrowColor #555555 skinparam classBackgroundColor #F9F9F9 2. 抽象产品A运输工具 interface TransportVehicle { void loadCargo() void startTransport() String getVehicleInfo() } note right of TransportVehicle b抽象产品A/b -- 运输工具接口定义所有运输工具 的通用行为 end note 3. 抽象产品B物流单据 interface LogisticsDocument { void generate() void print() String getDocumentInfo() } note right of LogisticsDocument b抽象产品B/b -- 物流单据接口定义所有单据的 通用行为 end note 4. 具体产品A1国内运输车辆 class DomesticTruck implements TransportVehicle { void loadCargo() void startTransport() String getVehicleInfo() } note right of DomesticTruck b具体产品A1/b -- 国内运输车辆厢式货车 适用于国内干线运输 end note 5. 具体产品A2国际运输工具 class InternationalCargoPlane implements TransportVehicle { void loadCargo() void startTransport() String getVehicleInfo() } note right of InternationalCargoPlane b具体产品A2/b -- 国际运输工具全货机 适用于跨境空运 end note 6. 具体产品B1国内运单 class DomesticWaybill implements LogisticsDocument { void generate() void print() String getDocumentInfo() } note right of DomesticWaybill b具体产品B1/b -- 国内运单标准快递面单 含收寄件人、重量、费用等信息 end note 7. 具体产品B2国际运单 class InternationalAirWaybill implements LogisticsDocument { void generate() void print() String getDocumentInfo() } note right of InternationalAirWaybill b具体产品B2/b -- 国际空运提单AWB 含报关信息、HS编码、原产地等 end note 8. 抽象工厂 interface LogisticsFactory { TransportVehicle createVehicle() LogisticsDocument createDocument() } note right of LogisticsFactory b抽象工厂/b -- 声明一组用于创建相关产品族的 方法每个方法返回一个抽象产品 end note 9. 具体工厂1国内物流工厂 class DomesticLogisticsFactory implements LogisticsFactory { TransportVehicle createVehicle() LogisticsDocument createDocument() } note right of DomesticLogisticsFactory b具体工厂1/b -- 生产国内物流产品族 国内运输车辆 国内运单 两者天然配套使用 end note 10. 具体工厂2国际物流工厂 class InternationalLogisticsFactory implements LogisticsFactory { TransportVehicle createVehicle() LogisticsDocument createDocument() } note right of InternationalLogisticsFactory b具体工厂2/b -- 生产国际物流产品族 国际货机 国际空运提单 两者天然配套使用 end note 11. 客户端 class LogisticsSystem { void processOrder(String orderType) } note right of LogisticsSystem b客户端Client/b -- 只依赖抽象工厂和抽象产品 无需知道具体实现类 end note 12. 关系连线 LogisticsFactory |.. DomesticLogisticsFactory : 实现 LogisticsFactory |.. InternationalLogisticsFactory : 实现 TransportVehicle |.. DomesticTruck : 实现 TransportVehicle |.. InternationalCargoPlane : 实现 LogisticsDocument |.. DomesticWaybill : 实现 LogisticsDocument |.. InternationalAirWaybill : 实现 DomesticLogisticsFactory .. DomesticTruck : 创建 DomesticLogisticsFactory .. DomesticWaybill : 创建 InternationalLogisticsFactory .. InternationalCargoPlane : 创建 InternationalLogisticsFactory .. InternationalAirWaybill : 创建 LogisticsSystem .. LogisticsFactory : 使用 enduml 《Java 23 种设计模式从踩坑到精通》快速导航开篇系列介绍与目录正篇抽象工厂 Abstract Factory —— 产品族创建如何避免“一锅粥”当前番外 · 抽象工厂模式 × 物流产品族生产你在这里创建型模式汇总结构型模式汇总行为型模式汇总 关注《Java 23 种设计模式从踩坑到精通》用 25 篇文章彻底吃透设计模式。福利预告全系列代码及 UML 源码将在完结时统一打包开放点击「关注」「收藏」第一时间获取。 除了设计模式我也在深挖智能物流实战WMS、托盘调度、机器学习落地。欢迎点击头像看看专栏 《出版社物流WMS智能调度实战》、《电商多平台电子面单对接实战》。技术相通思路可鉴。

相关新闻

SUNO Music API:AI音乐生成技术开发指南

SUNO Music API:AI音乐生成技术开发指南

2026/9/8 9:11:08

1. 项目概述:SUNO Music API 如何释放你的音乐创造力最近在AI音乐生成领域,SUNO Music API正在掀起一场创作革命。作为一名长期关注AI音乐技术的开发者,我花了三周时间深度测试这个API,发现它确实能大幅降低音乐创作门槛。不同于传…

企业社交链接提取_business-contact-social-links-skill

企业社交链接提取_business-contact-social-links-skill

2026/8/23 4:15:54

以下为本文档的中文说明 企业联系信息与社交媒体链接提取技能,能够自动从公开网络中提取企业的官方网站和社交媒体主页信息。它集成了两种 BrowserAct 模板以覆盖两种常见场景:当用户提供公司名称时,它通过 Google 搜索定位该公司的官方网站和…

零代码AI开发:用Dify快速搭建文本摘要工作流

零代码AI开发:用Dify快速搭建文本摘要工作流

2026/8/23 4:15:55

1. 项目概述:用Dify零代码搭建AI工作流 第一次接触Dify时,我就被它"用拖拽连线替代代码"的理念吸引了。作为一个经常需要快速验证AI想法的开发者,传统方式需要写大量胶水代码来串联不同模块,而Dify提供的可视化工作流搭…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/28 4:08:17

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/28 16:01:49

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

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/28 3:58:00

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

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/28 16:01:48

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/28 5:05:21

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/28 16:01:48

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…