ОТВЕТ ОБ ОБНОВЛЕНИИ ПОСЛЕ ОБНОВЛЕНИЯ ВОПРОСА - СМ. НИЖЕ
Я все еще думаю, что вы правы, используя шаблон Factory и исправляя перегрузку метода CreateLabel; но я думаю, что передавая LabelType методу CreateLabel, вы упускаете смысл использования шаблона Factory.
Ключевой момент: все назначение шаблона Factory заключается в инкапсуляции логики, которая выбирает конкретный подкласс для создания и возврата. Код вызова не должен указывать Factory, какой тип создавать. Преимущество заключается в том, что код, который вызывает Factory, защищен от изменений этой логики в будущем, а также от добавления новых конкретных подклассов к Factory. Все, что вам нужно для вызова, зависит от Factory и типа интерфейса, возвращаемого из CreateLabel.
Логика в вашем коде в точке, где вы вызываете Factory, должна выглядеть примерно так: псевдокод ...
// Need to create a label now
ILabel label;
if(we need to create a small label)
{
label = factory.CreateLabel(LabelType.SmallLabel, "ref1");
}
else if(we need to create a large label)
{
label = factory.CreateLabel(LabelType.LargeLabel, "ref1");
}
else if(we need to create a custom label)
{
label = factory.CreateLabel(LabelType.CustomLabel, "ref1", "Custom text")
}
... так что вы явно говорите Фабрике, что создавать. Это плохо, потому что каждый раз, когда в систему добавляется новый тип метки, вам нужно ...
- Изменить заводской код для работы с новым значением LabelType
- Идите и добавьте новое else-if везде, которое фабрика называет
Однако, если вы переместите логику, которая выбирает значение LabelType, на вашу фабрику, вы избежите этого. Логика заключена в фабрике вместе со всем остальным. Если в вашей системе добавлен новый тип метки, вам нужно всего лишь изменить Фабрику. Весь существующий код, вызывающий Factory, остается прежним, без каких-либо серьезных изменений.
Какую часть данных использует ваш текущий вызывающий код, чтобы решить, нужна ли большая или маленькая метка? Этот фрагмент данных должен быть передан фабричным методам CreateLabel ().
Ваши классы Factory и label могут выглядеть следующим образом ...
// Unchanged
public class BasicLabel: ILabel
{
public LabelSize Size {get; private set}
public string TrackingReference { get; private set; }
public SmallLabel(LabelSize size, string trackingReference)
{
Size = size;
TrackingReference = trackingReference;
}
}
// ADDED THE NULL OR EMPTY CHECK
public class CustomLabel : ILabel
{
public string TrackingReference { get; private set; }
public string CustomText { get; private set; }
public CustomLabel(string trackingReference, string customText)
{
TrackingReference = trackingReference;
if(customText.IsNullOrEmpty()){
throw new SomeException();
}
CustomText = customText;
}
}
public class LabelFactory
{
public ILabel CreateLabel(string trackingReference, LabelSize labelSize)
{
return new BasicLabel(labelSize, trackingReference);
}
public ILabel CreateLabel(string trackingReference, string customText)
{
return new CustomLabel(trackingReference, customText);
}
}
Надеюсь, это полезно.