当前位置: 首页 > news >正文

工厂方法模式(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 结构
  • 用最简单的方式解决创建问题
http://www.jsqmd.com/news/268446/

相关文章:

  • 2026Q1靖江财税公司合规榜,细分覆盖多场景 - 品牌智鉴榜
  • 初学者古筝怎么选?2026年热门古筝深度评测,古筝/瑶鸾古筝/瑶鸾古筝Y106系列,古筝厂家怎么选择 - 品牌推荐师
  • 【高精度气象】一场霜冻能赔多少?把气象预测变成“精算模型”的输入
  • 2025防疫物资回收厂家大比拼,口碑佼佼者是谁?隔离衣回收/防疫物资回收/防护服回收,防疫物资回收一站式服务有哪些 - 品牌推荐师
  • 银河麒麟v10服务器版Docker部署教程-.NET 6 WebAPI-nginx-redis-python3.8 - 指南
  • GESP认证C++编程真题解析 | 202403 二级
  • 2026年郑州回收废旧空调公司推荐榜:郑州恒森二手空调回收,中央空调回收/二手空调收购/空调回收/空调收购/回收空调/二手空调回收/收购中央空调/收购空调/废旧空调回收公司精选
  • GESP认证C++编程真题解析 | 202403 一级
  • 2025年目前排行前列的智能门窗品牌有哪些,全屋门窗/意式门窗/家居设计/欧式门窗/电动门窗供应商怎么选择 - 品牌推荐师
  • 腾讯会议搭配提词器推荐——芦笋提词器
  • 2026年电子级硫化氢定做厂家权威推荐榜单:高纯硫化氢/硫化氢减压阀/工业级硫化氢/硫化氢配件/液化硫化氢源头厂家精选
  • 【高精度气象】销量忽高忽低真不是运营锅:气象变量是隐藏杠杆
  • 2025年市场上服务好的扩口法兰批发推荐排行榜单,SAE法兰/方法兰/内螺纹法兰/分体法兰/法兰夹,扩口法兰品牌哪家好 - 品牌推荐师
  • 2026年支付宝消费红包高效变现指引 - 淘淘收小程序
  • 秦皇岛海港山海关北戴河抚宁昌黎英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 专业企业网站建设指南:价格、流程、注意事项一次说清
  • 9DVR帽椅|VR科普蛋椅|VR解锁动感科普新姿势!
  • 【风电功率预测】一次把风电预测做稳:时间对齐、分箱口径、极端样本三件套
  • 新型运载技术:广义管网运送机械系统
  • 2026年好评如潮,工业展展会口碑大揭秘!液压气动/压力机/减速机/装备/机床/工业/机械/传感器,工业展展览哪个好 - 品牌推荐师
  • 我至今用到最好的Claude Code Skills,让Agent把重复动作都做成工作流
  • 小程序计算机毕设之基于nodejs+微信小程序的垃圾分类助手系统垃圾分类和回收系统(完整前后端代码+说明文档+LW,调试定制等)
  • 漏洞挖掘核心知识点与实战技巧(新手零门槛指南)
  • 2026年行业内可靠的低压电力电缆供应厂家哪家好,高压电力电缆/ZC-YJV高压电力电缆,低压电力电缆企业推荐榜 - 品牌推荐师
  • 古筝选购不迷茫!2026年这家厂家的产品有何独到之处?瑶鸾古筝Y103系列(星辰)古筝生产厂家排行 - 品牌推荐师
  • 护网行动入门指南:普通人如何参与并积累实战经验
  • 国内有什么建站系统推荐
  • 新型运载技术:新概念航空动力技术
  • 亲测好用10个AI论文软件,助本科生轻松搞定毕业论文!
  • 视频汇聚平台EasyCVR破解偏远地区监控难题的技术实践