Предположим, у меня есть класс виджетов:
struct Widget {
public Color Color { get; set; }
public int Frobbles { get; set; }
}
Теперь мне нужно создать фабрику для создания этих виджетов, поэтому я создаю WidgetFactory:
abstract class WidgetFactory {
public virtual Widget GetWidget();
}
Как оказалось, вы можете сделать виджеты из нескольких разных материалов, но получающиеся виджеты в значительной степени одинаковы. Итак, у меня есть несколько реализаций WidgetFactory:
class GoldWidgetFactory : WidgetFactory {
public GoldWidgetFactory(GoldMine goldmine) {
//...
}
public Widget GetWidget() {
Gold g = goldmine.getGold();
//...
}
}
class XMLWidgetFactory : WidgetFactory {
public XMLWidgetFactory(XmlDocument xmlsource) {
//...
}
public Widget GetWidget() {
XmlNode node = //whatever
//...
}
}
class MagicWidgetFactory : WidgetFactory {
public Widget GetWidget() {
//creates widget from nothing
}
}
У меня такой вопрос: должен ли WidgetFactory быть абстрактным классом или интерфейсом? Я вижу аргументы в обоих направлениях:
Базовый класс:
- Реализации являются WidgetFactories
- Возможно, они смогут совместно использовать функциональность (скажем, метод
List<Widget> WidgetFactory.GetAllWidgets()
)
Интерфейс:
- Реализации не наследуют никакие данные или функциональные возможности от родительского
- Их внутренняя работа совершенно другая
- Определен только один метод
Тем, кто отвечает, это (в настоящее время) не параллельно с какой-либо реальной проблемой, но если / когда мне нужно будет реализовать этот шаблон, было бы полезно знать. Кроме того, «это не имеет значения» является правильным ответом.
Редактировать: Я должен указать, зачем сначала пройти через это. Гипотетическое использование этой иерархии классов будет выглядеть примерно так:
//create a widget factory
WidgetFactory factory = new GoldWidgetFactory(myGoldMine);
//get a widget for our own nefarious purposes
Widget widget = factory.GetWidget();
//this method needs a few widgets
ConsumeWidgets(factory);
Итак, метод GetGoldWidget()
в WidgetFactory - не очень хорошая идея. К тому же, возможно, появление в технологии Widget позволит нам добавлять различные и более экзотические типы виджетов в будущем? Добавлять новый класс для обработки проще и проще, чем использовать метод в существующем классе.