工厂方法Factory Method

Factory Method 解决"创建一个什么",Abstract Factory 解决"用哪一套来创建一群"

多语言本地化翻译系统

开发一个支持多语言的命令行工具。用户启动程序时指定语言参数(如 --lang=zh--lang=en),程序界面的所有提示文字需要以对应的语言显示。

如果直接在业务代码中写满 if language == "zh": ... elif language == "en": ...,每增加一种语言,就要在所有输出文字的地方添加新的条件分支。代码会迅速腐烂成难以维护的"意大利面条"。

工厂方法模式 在这里的解法是:将"翻译一段文字"定义为一个抽象接口(Localizer),每种语言实现自己的翻译逻辑(ChineseLocalizerEnglishLocalizer)。客户端不关心当前用的是哪种语言,只需要拿到一个 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的工厂方法源码分析】

相关推荐
赵广陆1 天前
企业实战:数据图与状态定义
pycharm·langchain·langgraph
青山是哪个青山1 天前
LangChain 学习笔记(九):上下文与记忆
笔记·学习·langchain
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-23-桥接模式(源码剖析篇)
java·设计模式·jdbc·桥接模式·源码分析·awt·java logging
一只叫煤球的猫1 天前
Spring AI 2.0 源码解析(二):Starter 如何自动装配 ChatClient ?
后端·面试·langchain
GISer_Jing1 天前
全栈AI实战:基于 TypeScript + LangChain + MCP 的企业级智能研发助手
前端·后端·ai·langchain·前端框架
嘟嘟07171 天前
TypeScript 工具类型通关:Pick、Omit、Partial、Record 区别与 Omit 等价实现一次讲清
设计模式·面试·typescript
红鼻子时代1 天前
从 @tool 到四层架构:一个查天气 Agent 的拆解
langchain·agent·软件架构
SL_staff1 天前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
Asize1 天前
3 种设计模式 + DI:Nest.js 后端第一课
后端·设计模式·nestjs
St_rive2 天前
Page Object设计模式
java·开发语言·设计模式