Factory Method 解决"创建一个什么",Abstract Factory 解决"用哪一套来创建一群"
多语言本地化翻译系统
开发一个支持多语言的命令行工具。用户启动程序时指定语言参数(如 --lang=zh 或 --lang=en),程序界面的所有提示文字需要以对应的语言显示。
如果直接在业务代码中写满 if language == "zh": ... elif language == "en": ...,每增加一种语言,就要在所有输出文字的地方添加新的条件分支。代码会迅速腐烂成难以维护的"意大利面条"。
工厂方法模式 在这里的解法是:将"翻译一段文字"定义为一个抽象接口(Localizer),每种语言实现自己的翻译逻辑(ChineseLocalizer、EnglishLocalizer)。客户端不关心当前用的是哪种语言,只需要拿到一个 Localizer,调用 localize() 即可。而"到底创建哪个语言的本地化器"这个决策,被封装在工厂函数 get_localizer() 中------一处修改,全局生效。
类图
这里使用了Python的鸭子类型来处理结构化子类。

代码实现
python
from typing import Protocol, Type
class Localizer(Protocol):
"""协议类"""
def localize(self, msg: str) -> str:
...
class ChineseLocalizer:
def localize(self, msg: str) -> str:
return msg
class EnglishLocalizer:
def __init__(self):
self.translation_dict = {
"深圳图书馆北馆": "Shenzhen Library North Branch",
"Python编程入门与实践": "Introduction to Python Programming and Practice",
"设计模式": "Design Patterns"
}
def localize(self, msg: str) -> str:
"""将中文翻译成英文,无法翻译则返回原文"""
return self.translation_dict.get(msg, msg)
def get_localizer(language: str) -> Localizer:
"""工厂方法"""
localizers: dict[str, Type[Localizer]] = {
"zh": ChineseLocalizer,
"en": EnglishLocalizer
}
return localizers.get(language, ChineseLocalizer)()
if __name__ == '__main__':
en, cn = get_localizer("en"), get_localizer("zh")
for msg in ["Pkmer", "在", "深圳图书馆北馆", "学习", "Python编程入门与实践", "设计模式"]:
print(f"{cn.localize(msg)} -> {en.localize(msg)}")
LangChain的init_chat_model工厂方法分析
详情见【LangChain 获得ChatModel的工厂方法源码分析】

