工厂可以类比一个字典(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)
这样封装的好处
- 新增类型时减少对既有分支的修改:注册一个新类即可,符合开闭原则的方向。
- 注册与创建分离:
REGISTRY负责记录“有什么”,create()负责“怎么创建”。 - 创建逻辑可以统一收口:懒加载、依赖注入、日志或对象缓存等逻辑,可以在
create()入口集中处理。
记忆锚点
看到“根据一个 key 得到一个对象”,就想到字典;工厂可以看作给这张字典加上注册语法和统一的创建入口。
Yoleo
正在构建