02-A-工厂方法模式详解
02-A-工厂方法模式详解关键词工厂方法、创建型、解耦、多态、Spring 集合注入工厂方法模式解决一个问题把创建对象这件事从使用方代码里抽出来让创建逻辑集中、可扩展、可测试。当你发现代码里有一堆if-else在new不同子类时就该考虑它了。 目录02-A-工厂方法模式详解 术语速查表一、不用工厂方法的问题二、模式结构三、业务场景多渠道支付四、简单工厂 vs 工厂方法五、框架中的同款实现六、常见误用与生产事故事故工厂没有重复检测七、总结 术语速查表术语人话解释工厂方法定义创建对象的接口让子类决定实例化哪个类简单工厂一个方法里用 if-else 或 switch 创建不同对象不算真正的设计模式但生产常用产品被创建的对象具体工厂负责创建某种具体产品的工厂自注册产品自己告诉工厂我能创建什么新增产品不用改工厂一、不用工厂方法的问题电商系统有多种支付方式微信、支付宝、银联。下单代码可能写成publicclassPaymentService{publicPaymentResultpay(LongorderId,Stringchannel,BigDecimalamount){Paymentpayment;if(WECHAT.equals(channel)){paymentnewWechatPayment();}elseif(ALIPAY.equals(channel)){paymentnewAlipayPayment();}elseif(UNION.equals(channel)){paymentnewUnionPayment();}else{thrownewIllegalArgumentException(不支持的支付渠道);}returnpayment.pay(orderId,amount);}}痛点新增渠道要改PaymentService违反开闭原则支付逻辑和创建逻辑混在一起难测试多个地方都写if-else创建对象重复。二、模式结构«interface»Paymentpay(orderId, amount) : PaymentResultWechatPaymentAlipayPaymentPaymentFactorycreatePayment(channel) : PaymentPaymentService-PaymentFactory factorypay(orderId, channel, amount) : PaymentResult调工厂创建执行执行客户端paymentService.pay(orderId, wechat, 100)PaymentService上下文统一入口PaymentFactory工厂按 channel 创建Payment 接口策略统一算法契约WechatPayment微信支付实现AlipayPayment支付宝实现PaymentResult支付结果角色说明Payment产品接口WechatPayment/AlipayPayment具体产品PaymentFactory工厂接口/具体工厂PaymentService使用方依赖工厂而不是具体产品。三、业务场景多渠道支付下面把「产品接口、具体产品、工厂、使用方」合并成一个完整的可运行示例。复制到 IDE 或在线编译器即可直接执行。importjava.math.BigDecimal;importjava.util.List;importjava.util.Map;importjava.util.function.Function;importjava.util.stream.Collectors;// 1. 产品接口 interfacePayment{Stringchannel();PaymentResultpay(LongorderId,BigDecimalamount);}// 2. 具体产品 classWechatPaymentimplementsPayment{OverridepublicStringchannel(){returnWECHAT;}OverridepublicPaymentResultpay(LongorderId,BigDecimalamount){System.out.println(微信支付: orderIdorderId, amountamount);returnPaymentResult.success(WorderId);}}classAlipayPaymentimplementsPayment{OverridepublicStringchannel(){returnALIPAY;}OverridepublicPaymentResultpay(LongorderId,BigDecimalamount){System.out.println(支付宝支付: orderIdorderId, amountamount);returnPaymentResult.success(AorderId);}}// 3. 工厂自注册 重复检测 classPaymentFactory{privatefinalMapString,PaymentpaymentMap;publicPaymentFactory(ListPaymentpayments){this.paymentMappayments.stream().collect(Collectors.toMap(Payment::channel,Function.identity(),(a,b)-{thrownewIllegalStateException(支付渠道重复注册: a.channel());}));}publicPaymentget(Stringchannel){PaymentpaymentpaymentMap.get(channel);if(paymentnull){thrownewIllegalArgumentException(不支持的支付渠道: channel);}returnpayment;}}// 4. 使用方 classOrderPaymentService{privatefinalPaymentFactorypaymentFactory;publicOrderPaymentService(PaymentFactorypaymentFactory){this.paymentFactorypaymentFactory;}publicPaymentResultpay(LongorderId,Stringchannel,BigDecimalamount){PaymentpaymentpaymentFactory.get(channel);returnpayment.pay(orderId,amount);}}// 5. 结果对象 classPaymentResult{privatefinalStringcode;privatefinalStringtradeNo;privatePaymentResult(Stringcode,StringtradeNo){this.codecode;this.tradeNotradeNo;}publicstaticPaymentResultsuccess(StringtradeNo){returnnewPaymentResult(SUCCESS,tradeNo);}OverridepublicStringtoString(){returnPaymentResult{codecode, tradeNotradeNo};}}// 6. 启动入口 publicclassMain{publicstaticvoidmain(String[]args){// 模拟 Spring 注入把具体产品收集进 ListListPaymentpaymentsList.of(newWechatPayment(),newAlipayPayment());PaymentFactoryfactorynewPaymentFactory(payments);OrderPaymentServiceservicenewOrderPaymentService(factory);// 分别走微信、支付宝渠道System.out.println(service.pay(1001L,WECHAT,newBigDecimal(99.90)));System.out.println(service.pay(1002L,ALIPAY,newBigDecimal(199.00)));// 不支持的渠道会抛异常try{service.pay(1003L,UNION,newBigDecimal(1.00));}catch(IllegalArgumentExceptione){System.out.println(捕获异常: e.getMessage());}}}运行说明把上面所有类放进同一个.java文件文件名Main.java即可直接运行输出会依次打印微信、支付宝的支付日志与结果对象并演示不支持的渠道抛异常若把List.of(new WechatPayment(), new AlipayPayment())中某个产品重复注册工厂会在启动时抛出「支付渠道重复注册」异常验证重复检测逻辑。四、简单工厂 vs 工厂方法维度简单工厂工厂方法核心一个工厂方法里 if-else每个产品有对应工厂扩展新增产品改工厂新增产品新增工厂类复杂度低稍高适用产品少、变化不频繁产品多、频繁新增生产建议业务代码里 Spring ListPayment自注册本质上是工厂方法的简化版最实用。五、框架中的同款实现框架应用说明SpringBeanFactory根据 BeanName 创建 BeanMyBatisSqlSessionFactory创建 SqlSessionSLF4JLoggerFactory根据名字获取 Logger 实例JDKCalendar.getInstance()不同地区返回不同 Calendar六、常见误用与生产事故事故工厂没有重复检测某团队支付渠道也使用自注册工厂但没有做重复 key 检测。两个并行开发的团队都注册了channel() CROSS_BORDER后加载的 Bean 覆盖了前者。结果同样订单随机走两种支付逻辑金额差异。修复工厂用Collectors.toMap加mergeFunction抛异常启动即失败。(a,b)-{thrownewIllegalStateException(重复注册: a.channel());}七、总结工厂方法的核心把创建哪个对象的判断从业务代码里抽出来。最实用的形态产品自描述 Spring 集合注入 Map 建立映射。必须做重复检测启动时报错好过运行时随机出错。与策略模式的区别工厂关注创建对象策略关注选择算法/行为实践中经常一起用。代价类数量增加调用链变长只有产品类型 ≥3 且会频繁新增时才值得上工厂。上一篇01-A-单例模式详解下一篇03-A-抽象工厂模式详解

相关新闻

03-A-抽象工厂模式详解

03-A-抽象工厂模式详解

03-A-抽象工厂模式详解 关键词:抽象工厂、产品族、配套对象、数据库方言、扩展性 抽象工厂模式和工厂方法很像,但关注点是"一整套配套产品"。比如你要换数据库,不只是换一个连接池,而是连接、分页、类型处理都要一起换。…

2026/10/17 13:40:43 阅读更多 →
Vue路由缓存实战:keep-alive实现前进刷新返回不刷新

Vue路由缓存实战:keep-alive实现前进刷新返回不刷新

最近在某个后台管理项目里,我给一套多标签页框架折腾路由缓存,被一个问题卡了几个晚上:列表页里点开详情,返回列表时列表位置全丢了,而且每次返回列表页,created都会重新执行一遍,接口重打、loa…

2026/10/17 13:39:42 阅读更多 →
区块链应用操作员实战:从需求调研到部署运维的完整指南

区块链应用操作员实战:从需求调研到部署运维的完整指南

简介:面向区块链应用操作员考试与日常实操整理的PDF资料,系统涵盖基础知识、智能合约、链上操作、身份权限和隐私保护等核心模块,适合备考“区块链应用技术考试”的初学者与在职操作员对照学习。资源仅含1个PDF文件,压缩包大小708…

2026/10/17 13:39:42 阅读更多 →

最新新闻

论文解读:语义感知后退视界规划器 面向物体中心的主动建图方案及工程参考

论文解读:语义感知后退视界规划器 面向物体中心的主动建图方案及工程参考

本文围绕2024年发表于IEEE Robotics and Automation Letters(RA-L)的论文《Semantics-Aware Receding Horizon Planner for Object-Centric Active Mapping》展开技术拆解,结合启元机器人的室内导航与场景建图需求,分析该方案的技…

2026/10/17 14:36:21 阅读更多 →
质子半导体剂量计基础

质子半导体剂量计基础

一、带电粒子与物质的四类相互作用 带电粒子(重带电粒子如质子、轻带电粒子如电子)入射物质,存在4种基础相互作用: 与核外电子的非弹性碰撞 库仑相互作用,粒子将能量传递给靶原子外层电子,造成原子电离或激发。这是带电粒子最主要的能量损失方式。LET(线性能量转移)统…

2026/10/17 14:36:21 阅读更多 →
artcraft创作工具链:从素材管理到输出归档的完整工作流

artcraft创作工具链:从素材管理到输出归档的完整工作流

1. 从“artcraft”这个名字说起:一个被低估的创作工具链思路第一次看到“artcraft”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率不是一个单一工具,而是一整套围绕“创作”这件事搭建起来的工作流。为什么这么说?因为“…

2026/10/17 14:36:21 阅读更多 →
项目启动与系统设计阶段总结:从需求调研到技术落地的关键实践

项目启动与系统设计阶段总结:从需求调研到技术落地的关键实践

这篇不是我写的,是别人文章。你想让我扮演那个“全能型资深博主”,根据标题生成一篇符合规范的长文。我来写。 “项目启动与系统设计阶段总结”,这个标题我太熟了。每隔一两个季度,我们组里就会写一篇类似的东西,挂在…

2026/10/17 14:36:21 阅读更多 →
ArtCraft:参数化材质生成方法论与可复用创意工作流

ArtCraft:参数化材质生成方法论与可复用创意工作流

1. 项目概述:ArtCraft 不是“艺术手作”的简单拼贴,而是一套可落地的创意生产方法论ArtCraft 这个词乍看像英文直译——art(艺术)和 craft(工艺/手艺)的组合,很容易被理解成“艺术手工”“创意D…

2026/10/17 14:36:21 阅读更多 →
Qt串口电源控制工具:一键开关设备电源

Qt串口电源控制工具:一键开关设备电源

简介:这是一份基于Qt框架开发的RS232串口电源控制程序,面向嵌入式初学者、电子工程实践者及自动化设备控制开发者,解决实验室/测试场景中对程控电源的远程开关与状态交互需求。项目采用C与Qt构建跨平台GUI应用,通过串口发送指令实…

2026/10/17 14:35:20 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →