You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现签名不同的Factory模式?现有方案是否合规?

适配不同方法签名的工厂模式优化方案

对应的设计模式

你遇到的场景需要结合**参数对象模式(Parameter Object Pattern)与工厂模式,本质是通过统一参数对象抹平不同实现类的方法签名差异,也可以看作是适配器模式(Adapter Pattern)**的简化应用——用统一参数作为适配层,让调用方无需关注具体实现的参数需求。

你的实现思路是否正确?

完全正确。通过定义包含所有可能参数的数据类factory_object_input,让所有工厂产出类的do方法统一接收该对象作为参数:

  • 调用方(my_class.jo)只需组装统一参数对象,不用关心具体子类需要哪些参数
  • 各子类可根据自身逻辑从参数对象中提取所需字段,实现各自功能

是否违反工厂模式规范?

不仅没有违反,反而完善了工厂模式的设计。工厂模式的核心是封装对象创建过程,让调用方依赖抽象而非具体实现。你最初的代码问题在于工厂产出的对象没有统一接口,调用方无法安全调用do方法;修改后的代码给所有子类统一了do方法签名,让调用方完全依赖抽象接口,这完全符合工厂模式的设计初衷。

可选优化建议

为了让代码更规范,可以增加抽象协议约束子类接口:

from dataclasses import dataclass
from typing import List, Protocol

@dataclass
class FactoryObjectInput:
    x: int
    y: str
    z: List[int]

# 定义协议,强制子类实现统一规范的do方法
class Handler(Protocol):
    def do(self, input_data: FactoryObjectInput) -> None:
        ...

class A:
    def do(self, input_data: FactoryObjectInput) -> None:
        print(input_data.x)

class B:
    def do(self, input_data: FactoryObjectInput) -> None:
        print(input_data.y)
        print(input_data.z)

class C:
    def do(self, input_data: FactoryObjectInput) -> None:
        print(input_data.x)
        print(input_data.y)

def my_factory(name: str) -> Handler:
    if name == "a":
        return A()
    elif name == "b":
        return B()
    elif name == "c":
        return C()
    raise ValueError(f"不支持的类型: {name}")

class MyClass:
    def __init__(self, config: str):
        self.child = my_factory(config)
    
    def jo(self, x: int, y: str, z: List[int], a: int, b: str, c: bool):
        input_data = FactoryObjectInput(x, y, z)
        self.child.do(input_data)
        # 其他逻辑

内容的提问来源于stack exchange,提问作者dinaa123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:31:02