Когда использовать абстрактный шаблон фабрики? - PullRequest
18 голосов
/ 02 декабря 2010

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

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

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

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

Пояснение:

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

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

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

Когда НЕ использовать фабрику:

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

Ссылка:

<Ч />

Мой вопрос: точна ли моя сводка, и имеет ли она смысл? Я что-то упустил из виду?

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 02 декабря 2010

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

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

Полагаю, я бы предложил добавить в выражение «когда использовать абстрактный шаблон фабрики» слово «когда вам не нужно, какой конкретный подкласс вы получите», и наоборот «когда использовать фабрику ".

РЕДАКТИРОВАТЬ: будьте осторожны, чтобы избежать универсальный инструментальный завод завод-изготовитель .

3 голосов
/ 02 декабря 2010

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

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

1 голос
/ 02 декабря 2010

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

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

...