news 2026/4/15 5:50:24

工厂方法模式(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/4/10 20:23:47

单片机超市RFID射频安全防盗报警系统+GSM上报设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

20-280、51单片机超市RFID射频安全防盗报警系统GSM上报设计(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码产品功能描述: 本系统由STC89C52单片机、RFID模块、蜂鸣器报警、按键、LCD1602液晶显示、GSM模块及电源组…

作者头像 李华
网站建设 2026/4/3 1:18:31

【高精度气象】销量忽高忽低真不是运营锅:气象变量是隐藏杠杆

你一定经历过这种“离谱波动”—— 同样的门店、同样的货、同样的活动力度:周一卖爆、周二断崖上午冷清、下午突然爆单这家店缺货,那家店积压运营复盘到凌晨,结论只有一句:“不确定因素太多”但你真要把锅全甩给运营吗&#xff1f…

作者头像 李华
网站建设 2026/4/2 14:34:58

Windows server 2012 R2系统怎么显示桌面图标

使用Windows server2012 R2服务器时,为了方便,我们可以添加桌面图标。方法一添加桌面图标的操作步骤如下:1、第一步,我们打开server服务器,就可以看到如下画面,桌面上只有一个回收站的图标。2、第二步&…

作者头像 李华
网站建设 2026/4/15 3:30:31

亲测MinerU:1.2B小模型解析学术论文效果惊艳

亲测MinerU:1.2B小模型解析学术论文效果惊艳 1. 引言:轻量级模型如何颠覆文档理解? 在当前大模型动辄数十亿、上百亿参数的背景下,一个仅1.2B参数的视觉多模态模型能否胜任复杂的学术文档解析任务?本文基于 OpenData…

作者头像 李华
网站建设 2026/4/12 9:05:37

基于Chrome140的Youtube账号自动化——需求分析环境搭建(一)

引言随着社交媒体营销的兴起,Youtube作为全球最大的社区论坛平台之一,已成为企业和个人进行品牌推广、社区运营的重要阵地。然而,手动管理Youtube账号很是麻烦,包括发帖、回复、投票、社区互动等繁琐操作。RPA(机器人流…

作者头像 李华