news 2026/6/25 10:15:59

Python 工厂模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 工厂模式

Python 中的工厂模式(Factory Patterns)

工厂模式是一类创建型设计模式,主要解决对象创建的问题,让对象的创建与使用分离,提高代码的灵活性和可扩展性。

在 GoF 的 23 种设计模式中,与“工厂”相关的有两种:

  1. 工厂方法模式(Factory Method)
  2. 抽象工厂模式(Abstract Factory)

此外,还有一种常见的简化版:简单工厂(Simple Factory)(严格来说不属于 GoF 23 种,但非常实用)。

下面用 Python 详细讲解这三种工厂模式。

1. 简单工厂(Simple Factory)

最简单的一种,不属于 GoF 标准模式,但实际项目中使用最多。

场景:根据输入类型创建不同类的实例。

classDog:defspeak(self):return"Woof!"classCat:defspeak(self):return"Meow!"classAnimalFactory:@staticmethoddefcreate_animal(animal_type:str):ifanimal_type=="dog":returnDog()elifanimal_type=="cat":returnCat()else:raiseValueError(f"Unknown animal type:{animal_type}")# 使用animal=AnimalFactory.create_animal("dog")print(animal.speak())# Woof!

优点:调用者无需知道具体类名
缺点:每次新增动物类型都需要修改工厂类,违反开闭原则

2. 工厂方法模式(Factory Method)

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

核心思想:一个工厂类对应一种产品,新增产品时新增对应的工厂子类。

fromabcimportABC,abstractmethod# 产品接口classAnimal(ABC):@abstractmethoddefspeak(self):pass# 具体产品classDog(Animal):defspeak(self):return"Woof!"classCat(Animal):defspeak(self):return"Meow!"# 工厂接口classAnimalFactory(ABC):@abstractmethoddefcreate_animal(self)->Animal:pass# 具体工厂classDogFactory(AnimalFactory):defcreate_animal(self)->Animal:returnDog()classCatFactory(AnimalFactory):defcreate_animal(self)->Animal:returnCat()# 使用(客户端代码)defclient_code(factory:AnimalFactory):animal=factory.create_animal()print(animal.speak())client_code(DogFactory())# Woof!client_code(CatFactory())# Meow!

优点:

  • 符合开闭原则:新增动物只需新增类和工厂类,无需修改现有代码
  • 解耦:客户端只依赖抽象工厂

适用场景:知道要创建哪一组相关对象,但想延迟到子类决定具体类

3. 抽象工厂模式(Abstract Factory)

提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。

场景:需要创建产品族(如不同风格的 UI 组件:Windows 风格 vs Mac 风格)

fromabcimportABC,abstractmethod# 抽象产品classButton(ABC):@abstractmethoddefrender(self):passclassCheckbox(ABC):@abstractmethoddefcheck(self):pass# 具体产品 - Windows 风格classWinButton(Button):defrender(self):return"Render Windows button"classWinCheckbox(Checkbox):defcheck(self):return"Check Windows checkbox"# 具体产品 - Mac 风格classMacButton(Button):defrender(self):return"Render Mac button"classMacCheckbox(Checkbox):defcheck(self):return"Check Mac checkbox"# 抽象工厂classGUIFactory(ABC):@abstractmethoddefcreate_button(self)->Button:pass@abstractmethoddefcreate_checkbox(self)->Checkbox:pass# 具体工厂classWinFactory(GUIFactory):defcreate_button(self):returnWinButton()defcreate_checkbox(self):returnWinCheckbox()classMacFactory(GUIFactory):defcreate_button(self):returnMacButton()defcreate_checkbox(self):returnMacCheckbox()# 客户端代码defclient_code(factory:GUIFactory):button=factory.create_button()checkbox=factory.create_checkbox()print(button.render())print(checkbox.check())# 根据操作系统选择工厂importplatformifplatform.system()=="Windows":factory=WinFactory()else:factory=MacFactory()client_code(factory)

优点:保证创建的产品是兼容的(同一族)
缺点:新增产品(如添加 Slider)需要修改所有工厂,扩展性差

三种工厂模式对比
模式复杂度扩展性(加新产品)扩展性(加新产品族)典型场景
简单工厂差(修改工厂)类型不多、变化不频繁
工厂方法每种产品独立,经常扩展新类型
抽象工厂差(修改所有工厂)需要产品族(如主题、风格)
Python 中的实用建议
  • Python 是动态语言,很多时候可以用函数字典映射代替简单工厂:
    animals={"dog":Dog,"cat":Cat}animal=animals[animal_type]()
  • 对于配置驱动的项目(如插件系统),工厂方法 + 注册机制很常见:
    classAnimalRegistry:factories={}@classmethoddefregister(cls,name,factory):cls.factories[name]=factory@classmethoddefcreate(cls,name):returncls.factories[name]().create_animal()AnimalRegistry.register("dog",DogFactory)animal=AnimalRegistry.create("dog")

如果你想看更实际的例子(如数据库连接工厂、配置文件解析工厂),或者某个模式的变体,请告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 11:05:13

Python 外观模式

Python 中的外观模式(Facade Pattern) 外观模式是一种结构型设计模式,其核心目的是: 为一个复杂子系统提供一个简单的、统一的接口,隐藏子系统的复杂性,让客户端更容易使用。 形象比喻:就像一…

作者头像 李华
网站建设 2026/6/25 6:41:10

PSMNet立体匹配网络:从理论到实践的完整指南

PSMNet立体匹配网络:从理论到实践的完整指南 【免费下载链接】PSMNet Pyramid Stereo Matching Network (CVPR2018) 项目地址: https://gitcode.com/gh_mirrors/ps/PSMNet PSMNet(Pyramid Stereo Matching Network)是由Jia-Ren Chang和…

作者头像 李华
网站建设 2026/6/16 19:52:17

Open-AutoGLM技术内幕曝光:90%开发者不知道的7个隐藏功能

第一章:Open-AutoGLM详细介绍Open-AutoGLM 是一个开源的自动化通用语言模型(GLM)推理与部署框架,旨在降低大模型在实际业务场景中的应用门槛。该框架集成了模型压缩、自动提示工程、上下文学习优化以及多后端推理支持等核心功能&a…

作者头像 李华
网站建设 2026/6/20 16:13:18

前端Token无感刷新:让用户像在游乐园畅玩一样流畅

❤ 写在前面 如果觉得对你有帮助的话,点个小❤❤ 吧,你的支持是对我最大的鼓励~ 个人独立开发wx小程序,感谢支持! 🎪 从游乐园门票说起 想象一下,你去游乐园玩,门票(Token&#xf…

作者头像 李华