工厂可以类比一个字典(dict),只是封装了更简单的注册和创建代码。工厂的本质是 “映射表 + 创建规则” 的封装。

核心思路

不使用工厂时,创建对象往往靠一长串 if/else 或 match 分支,根据类型字符串逐个判断要实例化哪个类:

if kind == "a":
    return ClassA()
elif kind == "b":
    return ClassB()

工厂可以把分支结构替换为一张注册表:

REGISTRY: dict[str, type] = {}

def register(kind: str):
    def decorator(cls):
        REGISTRY[kind] = cls
        return cls
    return decorator

@register("a")
class ClassA:
    pass

@register("b")
class ClassB:
    pass

def create(kind: str, **kwargs):
    return REGISTRY[kind](**kwargs)

这样封装的好处

  1. 新增类型时减少对既有分支的修改:注册一个新类即可,符合开闭原则的方向。
  2. 注册与创建分离:REGISTRY 负责记录“有什么”,create() 负责“怎么创建”。
  3. 创建逻辑可以统一收口:懒加载、依赖注入、日志或对象缓存等逻辑,可以在 create() 入口集中处理。

记忆锚点

看到“根据一个 key 得到一个对象”,就想到字典;工厂可以看作给这张字典加上注册语法和统一的创建入口。