Когда использовать абстрактный шаблон factory?
Я пытаюсь кратко описать , когда использовать factory, как для себя, так и для моей команды. Я столкнулся со следующими связанными вопросами, которые несколько помогли:
На основе этих ссылок и нескольких других источников (перечисленных внизу) я пришел к следующему:
Когда использовать абстрактный шаблон factory:
- когда вы используете интерфейс var или оператор 'new'
- например. Пользователь user = new ConcreteUserImpl();
- и код, который вы пишете, должен быть доступен для проверки/расширения в какой-то момент
Объяснение:
- по самой своей природе подразумевают множество реализаций (хорошо для модульного тестирования)
- интерфейс vars подразумевает код, совместимый с OCP- и LSP (поддержка подкласса)
- использование "нового" оператора прерывает OCP/DI, потому что высокосвязные классы трудно проверить или изменить.
"Я создаю factory для каждого типа объекта? Это кажется чрезмерным.
- нет, у вас может быть одна (или несколько) фабрик, которые производят множество (обычно связанных) типов объектов
- например. appFactory.createUser(); appFactory.createCatalog(); и т.д.
Если НЕ использовать factory:
- новый объект очень прост и вряд ли будет подклассифицирован
- например. Список списка = новый ArrayList();
- новый объект не интересен для тестирования
- не имеет зависимостей
- не выполняет релевантную или долговременную работу.
- например. Logger log = new SimpleLogger();
Литература:
Мой вопрос: является ли мое резюме точным, и имеет ли он смысл? Есть ли что-то, что я забыл?
Спасибо заранее.
Ответы
Ответ 1
Я бы также сказал, что не используйте factory, когда у вас есть конкретная реализация, которую вы хотите. Чтобы продолжить пример List
, я знаю, что мне нужен ArrayList
, потому что я делаю произвольный доступ. Я не хочу полагаться на factory получить это право, когда я могу сделать это сам.
И наоборот, когда я не хочу знать о конкретном подклассе, я могу использовать factory, и пусть он беспокоится о том, какой объект фактически создает экземпляр.
Я предполагаю, что я предлагаю вам добавить пулю к "когда использовать абстрактный шаблон factory", который гласит: "И вам все равно, какой конкретный подкласс вы получите", и обратный к "когда не использовать factory".
EDIT: Будьте осторожны, чтобы избежать универсального инструментария factory factory factory.
Ответ 2
В общем, используйте его, если хотите, чтобы вы могли переключать реализацию по внешней конфигурации.
JDBC и JAXP - отличные примеры. Для получения дополнительных примеров, проверьте этот ответ.
Ответ 3
Абстрактный шаблон Factory предоставляет способ инкапсулировать конкретные фабрики, которые разделяют некоторую общность друг с другом, что означает, что они реализуют один и тот же интерфейс/абстрактный класс.
Вам нужно использовать шаблон Factory всякий раз, когда вы хотите контролировать инициализацию своих объектов, вместо того, чтобы давать контроль потребителю.