c# - 具有不同方法签名的工厂方法
问题描述
我有三个运输公司,根据用户选择,我想生成标签。我计划为此实施工厂模式,但在我需要帮助以采取正确路线的地方几乎没有混淆。
这是详细信息
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”可能意味着什么,如果您需要为每个实例化的托运人类打印多个标签,那么这将不起作用。
或者,我建议您修改它以传入“选项”类,而不是直接将此布尔属性添加到方法签名中:
string GenerateLabel(Address FromAddress, Address ToAddress, LabelOptions options);
这意味着如果您找到更多具有不同参数要求的托运人,您可以对传递的选项类进行修改,而无需更新所有调用点。
推荐阅读
- c# - I want to check a bitwise enum value is "single" value in C#
- mongodb - Mongodb - Create a document with populated data
- python - 'NoneType' object has no attribute 'text' | Beautifulsoup
- python - QLineEdit focus highlight in window with Qt.WA_TranslucentBackground
- python - 将延迟对象分配给 dask 数组 TypeError:未指定长度的延迟对象没有 len()
- r - 将数据集分配给数据框列表
- flutter - 必须提供电子邮件地址/电子邮件地址格式错误
- angular - Remove ChangeDetectionStrategy on create component
- django - 请问如何在我的 url.py django 3 中使用 slug 创建 url?
- python - 我的 qss 选择器不适用于选择了正确的 ID