如何实现签名不同的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
相关产品推荐
相关产品推荐

