工厂模式是创建型设计模式,通过工厂封装对象创建逻辑,避免直接调用类构造器,提升灵活性与可维护性;适用于多类型对象创建场景,如文件解析、支付渠道等,常用简单工厂和工厂方法两种形式。

什么是工厂模式
工厂模式是一种创建型设计模式,它把对象的实例化过程从使用方中分离出来,让代码更灵活、更易维护。核心思想是:不直接用 class() 创建对象,而是通过一个“工厂”来决定创建哪个具体类的实例。
为什么需要工厂模式
当你的代码中出现大量 if-elif-else 判断来决定创建哪种对象时,就该考虑工厂模式了。比如处理不同文件格式(JSON、CSV、XML),或对接多个支付渠道(支付宝、微信、银联),硬编码判断会让逻辑散落、难以扩展。
- 新增一种类型,只需加一个类 + 注册到工厂,不用改原有调用逻辑
- 调用方完全不知道具体类名,只依赖统一接口,降低耦合
- 便于单元测试——可以轻松替换为 Mock 工厂返回测试对象
简单工厂 vs 工厂方法 vs 抽象工厂
Python 中最常用的是简单工厂(非 GoF 正式模式,但够用)和工厂方法(更规范)。抽象工厂适合多产品族场景(如不同操作系统的 UI 组件),日常开发较少见。
- 简单工厂:一个函数或类,根据参数返回不同实例。适合业务初期,结构轻量
- 工厂方法:定义创建对象的抽象方法,由子类决定实例化哪个类。适合有明确产品继承体系的场景
- Python 动态特性让抽象工厂略显冗余,通常用字典映射 + 简单工厂就能覆盖大部分需求
动手写一个实用的简单工厂
立即学习“Python免费学习笔记(深入)”;
from abc import ABC, abstractmethodclass LogHandler(ABC): @abstractmethod def write(self, message): ...
class ConsoleHandler(LogHandler): def write(self, message): print(f"[CONSOLE] {message}")
class FileHandler(LogHandler): def init(self, filename): self.filename = filename def write(self, message): with open(self.filename, "a") as f: f.write(f"[FILE] {message}\n")
class LogFactory: _handlers = { "console": ConsoleHandler, "file": lambda f: FileHandler(f) }
@classmethod def get_handler(cls, handler_type: str, **kwargs): handler_class = cls._handlers.get(handler_type) if not handler_class: raise ValueError(f"Unknown handler: {handler_type}") return handler_class(**kwargs) if callable(handler_class) else handler_class()使用
logger = LogFactory.get_handler("file", filename="app.log") logger.write("User logged in")
注意:lambda 或闭包用于带参构造,避免工厂类变得臃肿;字典注册比长串 if 更易维护。










