news 2026/3/23 21:43:17

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/3/12 15:16:36

XV3DGS-UEPlugin 高斯泼溅插件新手完全指南 [特殊字符]

XV3DGS-UEPlugin 高斯泼溅插件新手完全指南 🚀 【免费下载链接】XV3DGS-UEPlugin 项目地址: https://gitcode.com/gh_mirrors/xv/XV3DGS-UEPlugin 欢迎来到XV3DGS-UEPlugin的世界!这是一款专为Unreal Engine 5设计的高斯泼溅模型插件&#xff0c…

作者头像 李华
网站建设 2026/3/22 3:06:57

FinBERT2金融NLP实战指南:10分钟从零掌握专业文本分析

FinBERT2金融NLP实战指南:10分钟从零掌握专业文本分析 【免费下载链接】FinBERT 项目地址: https://gitcode.com/gh_mirrors/finb/FinBERT 在金融科技快速发展的今天,如何让AI真正理解专业金融文本?传统通用NLP模型在处理财经新闻、研…

作者头像 李华
网站建设 2026/3/21 21:46:28

泰国地理JSON数据终极指南:从省份到子区县的全方位解决方案

泰国地理JSON数据终极指南:从省份到子区县的全方位解决方案 【免费下载链接】thailand-geography-json JSON files for Thailands geography data, including provinces, districts, subdistricts, and postal codes, adhering to best practices for optimal perfo…

作者头像 李华
网站建设 2026/3/22 9:14:20

IDM激活完全指南:实现永久使用的终极解决方案

IDM激活完全指南:实现永久使用的终极解决方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为IDM的30天试用限制而苦恼吗?每次试用…

作者头像 李华
网站建设 2026/3/12 21:11:19

macOS iSCSI Initiator 实战手册:三步打造企业级网络存储方案

macOS iSCSI Initiator 是一款专为苹果系统设计的开源存储扩展工具,能够将你的 Mac 电脑无缝连接到远程 iSCSI 存储设备,实现存储空间的无限扩展。无论你是需要处理大型媒体文件的创意工作者,还是寻求高效数据共享的企业用户,这款…

作者头像 李华