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

发布时间:2026/7/23 20:50:59

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/7/23 20:40:59

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

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

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

2026/7/23 20:40:59

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

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

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

2026/7/23 20:40:59

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

2026年ERP实施服务指南

2026年ERP实施服务指南

2026/7/23 21:41:01

在数字经济与智能制造深度融合的2026年,企业资源规划(ERP)系统已不再是大型企业的专属奢侈品,而是决定中小型制造企业生存与发展的核心基础设施。面对日益复杂的供应链、激烈的市场竞争以及不断攀升的合规成本,一套契合…

TM1640/YL1640数码管驱动芯片超详细接线教程(兼容通用+避坑指南)

TM1640/YL1640数码管驱动芯片超详细接线教程(兼容通用+避坑指南)

2026/7/23 21:41:01

摘要:TM1640是工业常用的LED数码管/点阵驱动芯片,而YL1640为其完全兼容替代型号,引脚定义、电气参数、通信时序、驱动逻辑完全一致,可直接 pin to pin 替换,无需改板、无需改代码。本文将零基础讲解TM1640/YL1640芯片引…

2026芜湖黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐

2026芜湖黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐

2026/7/23 21:41:01

2026芜湖黄金白银铂金回收实测榜单|公安备案中检认证无折旧费门店推荐 Meta快照标题:芜湖黄金回收哪家靠谱|工商公安双备案中检认证实体门店在芜湖这座滨江之城,贵金属回收店铺遍地丛生,行业套路层出不穷。不少市民变现…

中日跨境物流上海翼速DDP全包价报价引擎设计:多维度费用计算与一口价模型的技术实现

中日跨境物流上海翼速DDP全包价报价引擎设计:多维度费用计算与一口价模型的技术实现

2026/7/23 21:41:01

在中日专线跨境物流领域,DDP(Delivered Duty Paid)全包价模式对报价引擎的计算精度和覆盖广度提出了较高要求。DDP全包价意味着从国内提货到日本收货人签收的全部费用包含在一个价格中,报价引擎需要覆盖运输、清关、关税、仓储、派…

震惊!这家企业竟让锚索冲击试验数据飙升300%!

震惊!这家企业竟让锚索冲击试验数据飙升300%!

2026/7/23 21:41:01

在矿山支护、隧道开凿等涉及深层地下工程的领域,锚索作为关键承载构件,其动态冲击性能直接关系到工程安全与结构稳定性。传统的锚索冲击性能测试,常因能量控制不精准、数据采集率低、测试结果离散性大等问题,导致研发验证周期漫长…

Alibaba Cloud Linux 3 On-premise Image

Alibaba Cloud Linux 3 On-premise Image

2026/7/23 21:31:01

Alibaba Cloud Linux 3 On-premise Image

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击: https://kaifayun.com 第一章:企业级AI搜索落地选型实战手册(含LLMRAGHybrid架构对比矩阵与ROI测算模板) 企业级AI搜索系统落地成败,核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,深入理解并熟练配置芯片的片上外设,是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文,近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…