Я думаю, что вы должны задать себе вопрос: Почему я здесь использую метод Фабрики?
Если ответ « из-за A », и A является веской причиной, продолжайте делать это, даже если это означает некоторый дополнительный код. Если ответ «, я не знаю; потому что я слышал, что вы должны делать это таким образом? », тогда вам следует пересмотреть.
Давайте рассмотрим стандартные причины использования заводов. Вот что Википедия говорит о шаблоне метода Factory:
[...], он занимается проблемой создания объектов (продуктов) без указания точного класса объекта, который будет создан. Шаблон проектирования фабричного метода решает эту проблему, определяя отдельный метод для создания объектов, чьи подклассы можно затем переопределить, чтобы указать производный тип продукта, который будет создан.
Поскольку ваш WidgetFactory равен Private
, это, очевидно, не причина, по которой вы используете этот шаблон. Как насчет самого «шаблона фабрики» (независимо от того, реализуете ли вы его с помощью метода фабрики или абстрактного класса)? Опять же, Википедия говорит :
Использовать фабричный шаблон при:
- Создание объекта исключает повторное использование без значительного дублирования кода.
- Создание объекта требует доступа к информации или ресурсам, которые не должны содержаться в составляющем объекте.
- Управление жизненным циклом созданных объектов необходимо централизовать для обеспечения согласованного поведения.
Из вашего примера кода не похоже, что все это соответствует вашим потребностям. Итак, вопрос (на который могут ответить только вы): (1) Насколько вероятно, что вам понадобятся функции централизованной фабрики для ваших виджетов в будущем и (2) насколько это дорого изменить все обратно на заводской подход, если он понадобится вам в будущем? Если оба значения низкие, вы можете временно отказаться от метода Factory.
РЕДАКТИРОВАТЬ: Позвольте мне вернуться к вашему особому случаю после этой общей разработки: обычно это a = new XyzWidget()
против a = WidgetFactory.Create(WidgetType.Xyz)
. В вашем случае, однако, у вас есть (числовой?) typeId
из базы данных. Как правильно написал Марк, вам нужна эта typeId -> className
карта где-то .
Таким образом, в этом случае хорошей причиной для использования фабричного метода может быть: «В любом случае мне нужен какой-то огромный ConvertWidgetTypeIdToClassName
оператор select-case-case, поэтому использование фабричного метода не требует дополнительного кода plus он предоставляет преимущества заводского метода бесплатно, если они мне когда-нибудь понадобятся. "
В качестве альтернативы, вы можете сохранить имя класса виджета в базе данных (у вас, вероятно, уже есть таблица WidgetType
с первичным ключом typeId
в любом случае, верно?) И создать класс, используя отражение (если ваш язык позволяет для этого типа вещей). Это имеет много преимуществ (например, вы можете добавить DLL-файлы с новыми виджетами и не нужно менять свой основной код CMS), но также и недостатки (например, «волшебная строка» в вашей базе данных, которая не проверяется во время компиляции; возможный код) инъекция, в зависимости от того, кто имеет доступ к этой таблице).