Подтвердить что ты не робот

Когда использовать абстрактный шаблон factory?

Я пытаюсь кратко описать , когда использовать factory, как для себя, так и для моей команды. Я столкнулся со следующими связанными вопросами, которые несколько помогли:

На основе этих ссылок и нескольких других источников (перечисленных внизу) я пришел к следующему:

Когда использовать абстрактный шаблон factory:

  • когда вы используете интерфейс var или оператор 'new'
    • например. Пользователь user = new ConcreteUserImpl();
  • и код, который вы пишете, должен быть доступен для проверки/расширения в какой-то момент

Объяснение:

  • по самой своей природе подразумевают множество реализаций (хорошо для модульного тестирования)
  • интерфейс vars подразумевает код, совместимый с OCP- и LSP (поддержка подкласса)
  • использование "нового" оператора прерывает OCP/DI, потому что высокосвязные классы трудно проверить или изменить.

"Я создаю factory для каждого типа объекта? Это кажется чрезмерным.

  • нет, у вас может быть одна (или несколько) фабрик, которые производят множество (обычно связанных) типов объектов
  • например. appFactory.createUser(); appFactory.createCatalog(); и т.д.

Если НЕ использовать factory:

  • новый объект очень прост и вряд ли будет подклассифицирован
    • например. Список списка = новый ArrayList();
  • новый объект не интересен для тестирования
    • не имеет зависимостей
    • не выполняет релевантную или долговременную работу.
    • например. Logger log = new SimpleLogger();

Литература:


Мой вопрос: является ли мое резюме точным, и имеет ли он смысл? Есть ли что-то, что я забыл?

Спасибо заранее.

4b9b3361

Ответ 1

Я бы также сказал, что не используйте factory, когда у вас есть конкретная реализация, которую вы хотите. Чтобы продолжить пример List, я знаю, что мне нужен ArrayList, потому что я делаю произвольный доступ. Я не хочу полагаться на factory получить это право, когда я могу сделать это сам.

И наоборот, когда я не хочу знать о конкретном подклассе, я могу использовать factory, и пусть он беспокоится о том, какой объект фактически создает экземпляр.

Я предполагаю, что я предлагаю вам добавить пулю к "когда использовать абстрактный шаблон factory", который гласит: "И вам все равно, какой конкретный подкласс вы получите", и обратный к "когда не использовать factory".

EDIT: Будьте осторожны, чтобы избежать универсального инструментария factory factory factory.

Ответ 2

В общем, используйте его, если хотите, чтобы вы могли переключать реализацию по внешней конфигурации.

JDBC и JAXP - отличные примеры. Для получения дополнительных примеров, проверьте этот ответ.

Ответ 3

Абстрактный шаблон Factory предоставляет способ инкапсулировать конкретные фабрики, которые разделяют некоторую общность друг с другом, что означает, что они реализуют один и тот же интерфейс/абстрактный класс.

Вам нужно использовать шаблон Factory всякий раз, когда вы хотите контролировать инициализацию своих объектов, вместо того, чтобы давать контроль потребителю.