首页 > 解决方案 > 具有不同方法签名的工厂方法

问题描述

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

这是详细信息

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
    }
}

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

标签: c#architecturefactory-pattern

解决方案


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

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);

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


推荐阅读