【问题标题】:Factory method with different method signature具有不同方法签名的工厂方法
【发布时间】:2020-05-22 20:51:18
【问题描述】:

我有三个承运商,我想根据用户选择生成标签。我计划为此实施工厂模式,但在需要帮助以采取正确路线的地方几乎没有混淆。

这里是详细信息

public interface IShipper
{
    string GenerateLabel(Address FromAddress, Address ToAddress);
}
public class USPS : IShipper
{
    public string GenerateLabel(Address FromAddress, Address ToAddress)
    {
        //GET USPS LABEL FOR PROVIDED ADDRESSES
    }
}
public class UPS : IShipper
{
    public string GenerateLabel(Address FromAddress, Address ToAddress)
    {
        //GET UPS LABEL FOR PROVIDED ADDRESSES
    }
}

这就是混乱。我们有第三家航运公司,提供额外的出境选择。客户可以选择也可以不选择。

public class OutBundShipper
{
    public string GenerateLabel(Address FromAddress, Address ToAddress, bool HasOutbound)
    {
//GET OutBundShipper LABEL FOR PROVIDED ADDRESSES
    }
}

有了这些信息,我想知道什么是更好的方法

  • 为所有类添加 HasOutBound 参数到 GenerateLabel 方法。这样一来,它就会保持一致并与界面保持一致。
  • 是否应该在接口中添加重载方法并在 USPS 和 UPS 类中抛出未实现的异常?
  • 还有其他更好的方法吗?

【问题讨论】:

  • 您还没有说明为什么要使用工厂模式;这将有助于提供最佳解决方案。

标签: c# architecture factory-pattern


【解决方案1】:

作为替代方案,您只需将其传递给您的工厂方法:

public IShipper GetShipper(ShipperType type, bool hasOutbound) {
     switch (type) {
          case USPS:
             return new USPS();
          ....
          case Outbound:                  
             return new OutboundShipper(hasOutbound)
     }
}

并像以前一样使用您的工厂方法。

不完全确定这是否是您需要的 - 我不知道“hasoutbound”可能意味着什么,如果您需要为每个实例化的托运人类打印多个标签,那么这将不起作用。


除此之外,我建议您修改它以传入一个“选项”类,而不是直接将此布尔属性添加到方法签名中:

string GenerateLabel(Address FromAddress, Address ToAddress, LabelOptions options);

这意味着,如果您发现更多具有不同参数要求的托运人,您可以对传递的选项类进行修改,而无需更新所有调用点。

【讨论】: