具有不同方法签名的工厂方法
Factory method with different method signature
我有三个承运商,根据用户选择,我想生成标签。我计划为此实施工厂模式,但在我需要帮助以采取正确路线的地方几乎没有混淆。
这是详细信息
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 中抛出未实现的异常类?
- 还有其他更好的方法吗?
作为替代方案,您只需将其传递到您的工厂方法中:
public IShipper GetShipper(ShipperType type, bool hasOutbound) {
switch (type) {
case USPS:
return new USPS();
....
case Outbound:
return new OutboundShipper(hasOutbound)
}
}
并像以前一样使用您的工厂方法。
不完全确定这是否是您需要的 - 我不知道 'hasoutbound' 可能意味着什么,如果您需要为每个实例化的托运人 class 打印多个标签,那么这将不起作用.
或者,与其将此布尔值 属性 直接添加到方法签名,我建议您将其修改为传入 'options' class:
string GenerateLabel(Address FromAddress, Address ToAddress, LabelOptions options);
这意味着,如果您发现更多具有不同参数要求的托运人,您可以对传递的选项进行修改class,而无需更新所有调用点。
我有三个承运商,根据用户选择,我想生成标签。我计划为此实施工厂模式,但在我需要帮助以采取正确路线的地方几乎没有混淆。
这是详细信息
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 中抛出未实现的异常类?
- 还有其他更好的方法吗?
作为替代方案,您只需将其传递到您的工厂方法中:
public IShipper GetShipper(ShipperType type, bool hasOutbound) {
switch (type) {
case USPS:
return new USPS();
....
case Outbound:
return new OutboundShipper(hasOutbound)
}
}
并像以前一样使用您的工厂方法。
不完全确定这是否是您需要的 - 我不知道 'hasoutbound' 可能意味着什么,如果您需要为每个实例化的托运人 class 打印多个标签,那么这将不起作用.
或者,与其将此布尔值 属性 直接添加到方法签名,我建议您将其修改为传入 'options' class:
string GenerateLabel(Address FromAddress, Address ToAddress, LabelOptions options);
这意味着,如果您发现更多具有不同参数要求的托运人,您可以对传递的选项进行修改class,而无需更新所有调用点。