news 2026/6/10 16:36:06

工厂方法模式(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/10 12:33:38

低代码平台,企业数字化转型的加速器

一、低代码平台,企业数字化转型的新利器在当今数字化时代,企业面临着日益激烈的市场竞争和快速变化的客户需求。为了保持竞争力,企业需要不断提升自身的数字化能力,实现业务流程的自动化和智能化。然而,传统的软件开发…

作者头像 李华
网站建设 2026/6/10 12:32:57

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

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

作者头像 李华
网站建设 2026/6/10 12:35:32

计算机视觉的 2026:从“堆算力”竞赛,到“省算力”智慧

2026 年,计算机视觉早已不是实验室里的小众技术 —— 它是自动驾驶汽车的 “眼睛”,是医疗影像诊断的 “辅助手”,是机器人交互的 “感知中枢”,更是多模态大模型理解世界的核心支柱。从手机端的实时美颜到工业界的精密检测&#…

作者头像 李华
网站建设 2026/6/10 12:38:34

专业企业网站建设指南:价格、流程、注意事项一次说清

在数字化浪潮席卷各行各业的今天,企业网站已不再是互联网世界的"可选装饰",而是企业生存发展的战略必需品。它不仅是24小时在线的品牌展厅、业务窗口,更是连接客户、传递价值、驱动增长的核心数字枢纽。一个专业、高效、体验出色的…

作者头像 李华
网站建设 2026/6/9 6:46:05

微信小程序毕设项目:基于nodejs+微信小程序的垃圾分类和回收系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/9 23:41:52

微信小程序毕设项目:基于springboot+微信小程序的话剧票务管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华