具有不同方法签名的工厂方法

问题描述 投票:0回答:1

我有三个运输公司,根据用户选择,我想生成标签。我打算为此实现Factory模式,但是在需要帮助以采取正确的路线时,几乎没有什么混乱。

这里是详细信息

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个回答
0
投票

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

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

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

不完全确定这是否是您需要的-我不知道什么是'hasoutbound'可能表示的,并且如果您需要为每个实例化的托运人类打印多个标签,则将无法使用。


或者,不建议将此布尔属性直接添加到方法签名中,建议将其修改为传递给'options'类:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.