news 2026/6/15 19:23:49

工厂方法模式(Factory Method)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工厂方法模式(Factory Method)

在真实项目中,对象的创建往往比使用更复杂
如果你发现代码中频繁出现if-else或根据参数去new不同的类,那基本已经到了该用工厂方法模式的时候了。


一、工厂方法模式解决什么问题

先看一个非常常见的写法:

defcreate_payment(pay_type):ifpay_type=="wechat":returnWeChatPay()elifpay_type=="alipay":returnAliPay()elifpay_type=="bank":returnBankPay()else:raiseValueError("unsupported pay type")

问题很明显:

  • 新增一种支付方式,必须修改这个函数
  • 创建逻辑与业务逻辑耦合
  • 违反开闭原则

工厂方法模式的目的就是:

把“创建对象的逻辑”从使用对象的地方解耦出来。


二、什么是工厂方法模式

**工厂方法模式(Factory Method)**的定义:

定义一个创建对象的接口,让子类决定实例化哪一个类。

核心思想:

  • 使用方只依赖抽象
  • 创建细节由工厂或子类负责

三、一个最基础的 Python 工厂方法示例

1. 抽象产品

fromabcimportABC,abstractmethodclassPayment(ABC):@abstractmethoddefpay(self,amount):pass

2. 具体产品

classWeChatPay(Payment):defpay(self,amount):print(f"微信支付{amount}")classAliPay(Payment):defpay(self,amount):print(f"支付宝支付{amount}")

3. 工厂类

classPaymentFactory:@staticmethoddefcreate(pay_type:str)->Payment:ifpay_type=="wechat":returnWeChatPay()ifpay_type=="alipay":returnAliPay()raiseValueError("unsupported pay type")

使用方:

payment=PaymentFactory.create("wechat")payment.pay(100)

四、为什么这还不够“工厂方法”

上面的写法虽然集中管理了创建逻辑,但:

  • 依然需要修改工厂代码
  • 本质还是if-else

真正的工厂方法强调:

通过继承扩展工厂,而不是修改工厂。


五、标准工厂方法模式结构

1. 抽象工厂

classPaymentFactory(ABC):@abstractmethoddefcreate(self)->Payment:pass

2. 具体工厂

classWeChatPayFactory(PaymentFactory):defcreate(self)->Payment:returnWeChatPay()classAliPayFactory(PaymentFactory):defcreate(self)->Payment:returnAliPay()

使用方式:

factory=WeChatPayFactory()payment=factory.create()payment.pay(100)

新增支付方式时:

  • 新增产品类
  • 新增工厂类
  • 无需修改原有代码

六、Python 风格的工厂方法(推荐)

Python 中,很多时候没必要写那么多类

使用字典 + 类引用

classPaymentFactory:_mapping={"wechat":WeChatPay,"alipay":AliPay,}@classmethoddefcreate(cls,pay_type:str)->Payment:try:returncls._mapping[pay_type]()exceptKeyError:raiseValueError("unsupported pay type")

优点:

  • 代码简洁
  • 易于维护
  • 更符合 Python 风格

七、工厂方法 vs 直接实例化

对比点直接 new工厂方法
扩展性
解耦
可测试性
代码复杂度

适用原则:

  • 对象类型固定、变化少 → 直接实例化
  • 对象类型多、变化频繁 → 工厂方法

八、工厂方法常见误区

1. 工厂类变成“上帝类”

  • 包含大量 if-else
  • 违反单一职责

解决方案:

  • 拆分工厂
  • 或引入抽象工厂

2. 为了工厂而工厂

  • 只有一个实现类
  • 没有扩展需求

👉 直接实例化即可。


九、总结

工厂方法模式的核心价值在于:

  • 解耦创建与使用
  • 遵循开闭原则
  • 为系统预留扩展空间

在 Python 中:

  • 思想比形式重要
  • 不必拘泥 UML 结构
  • 用最简单的方式解决创建问题
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 6:46:09

2026最新降AI工具实测红黑榜:从踩坑到通关的全攻略

面对日益精准的AIGC检测,毕业论文的“AI率”已成为一道关键门槛。我通过实测十余款工具,将真正有效的解决方案与避坑经验总结于此,助你高效、经济地完成论文。一、核心工具全景测评:效果、成本与选择一目了然为帮助你快速决策&…

作者头像 李华
网站建设 2026/6/15 6:48:01

GESP认证C++编程真题解析 | 202403 二级

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

作者头像 李华
网站建设 2026/6/15 6:49:46

基于S7-200组态王3泵变频恒压供水系统设计

基于S7-200组态王3泵变频恒压供水系统设计 本设计包括设计报告,PLC组态仿真,I/O接口,带注释程序pdf版,接线图,控制电路图,主电路图 系统功能:272 PLC控制变频恒压供水系统关键是主要有变频器、可…

作者头像 李华
网站建设 2026/6/15 6:48:03

项目解决方案:电梯制造厂AI识别建设解决方案

目录 第一章 项目背景 1.1 智能化转型需求 1.2 安全管理需求升级 1.3 技术革新推动 1.4 政策支持与导向 第二章 需求确认 2.1 多平台访问需求 2.2 权限管理与安全需求 2.3 AI识别需求 2.4 数据整合与分析需求 第三章 建设目标 3.1 经济完备,高性价比 3…

作者头像 李华
网站建设 2026/6/15 6:51:07

GESP认证C++编程真题解析 | 202403 一级

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

作者头像 李华