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

发布时间:2026/7/23 20:51: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智能调度实战》、《电商多平台电子面单对接实战》。技术相通思路可鉴。

相关新闻