更新我已经更新了示例以更好地说明我的问题.我意识到它缺少一个特定点 - 即该CreateLabel()
方法总是采用标签类型,因此工厂可以决定要创建的标签类型.事实是,它可能需要获得更多或更少的信息,具体取决于它想要返回的标签类型.
我有一个工厂类,它返回表示要发送到打印机的标签的对象.
工厂类看起来像这样:
public class LargeLabel : ILabel { public string TrackingReference { get; private set; } public LargeLabel(string trackingReference) { TrackingReference = trackingReference; } } public class SmallLabel : ILabel { public string TrackingReference { get; private set; } public SmallLabel(string trackingReference) { TrackingReference = trackingReference; } } public class LabelFactory { public ILabel CreateLabel(LabelType labelType, string trackingReference) { switch (labelType) { case LabelType.Small: return new SmallLabel(trackingReference); case LabelType.Large: return new LargeLabel(trackingReference); } } }
假设我创建了一个名为CustomLabel的新标签类型.我想从工厂返回这个,但它需要一些额外的数据:
public class CustomLabel : ILabel { public string TrackingReference { get; private set; } public string CustomText { get; private set; } public CustomLabel(string trackingReference, string customText) { TrackingReference = trackingReference; CustomText = customText; } }
这意味着我的工厂方法必须改变:
public class LabelFactory { public ILabel CreateLabel(LabelType labelType, string trackingReference, string customText) { switch (labelType) { case LabelType.Small: return new SmallLabel(trackingReference); case LabelType.Large: return new LargeLabel(trackingReference); case LabelType.Custom: return new CustomLabel(trackingReference, customText); } } }
我不喜欢这个,因为工厂现在需要满足最低的公分母,但同时CustomLabel类需要获得自定义文本值.我可以提供额外的工厂方法作为覆盖,但我想强制执行CustomLabel需要值的事实,否则它只会被赋予空字符串.
实现此方案的正确方法是什么?
那么,您想如何调用工厂方法?
专注于您希望如何使用您的API,实施通常会使自己相当清楚.如果将所需的API结果写为单元测试,则可以更轻松地完成此操作.
过载可能是正确的做法,但这实际上取决于你想如何使用工厂.