В чем разница между реализациями Factory Method? - PullRequest
1 голос
/ 14 апреля 2020

В книге GoF говорится, что существует два способа реализации Фабричного метода:

При применении шаблона Фабричного метода учитывайте следующие проблемы:

  1. Два основных сорта . Два основных варианта шаблона Factory Method - это случай, когда класс Creator является абстрактным классом и не предоставляет реализацию для метода фабрики, который он объявляет, и случай, когда Creator является конкретным классом и предоставляет реализацию по умолчанию для заводской метод. Также возможно иметь абстрактный класс, который определяет реализацию по умолчанию, но это не так часто. В первом случае для определения реализации требуются подклассы, поскольку разумных значений по умолчанию нет. Это обходит дилемму необходимости создавать непредвиденные классы. Во втором случае конкретный Создатель использует фабричный метод прежде всего для гибкости. Он следует правилу, которое гласит: «Создавайте объекты в отдельной операции, чтобы подклассы могли переопределять способ их создания». Это правило гарантирует, что разработчики подклассов могут при необходимости изменять класс объектов, которые создает их родительский класс.
  2. Параметризованные фабричные методы . Другой вариант шаблона позволяет фабричному методу создавать несколько видов продуктов. Фабричный метод принимает параметр, который определяет тип создаваемого объекта. Все объекты, создаваемые фабричным методом, будут использовать интерфейс Product. В примере документа приложение может поддерживать различные виды документов. Вы передаете CreateDocument дополнительный параметр, чтобы указать тип создаваемого документа.

Шаблоны проектирования (Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения)

В каких случаях я должен использовать один подход вместо другого. Каковы преимущества и недостатки, когда я предпочитаю один подход вместо другого?

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

1 Ответ

1 голос
/ 14 апреля 2020

Слава за чтение книги. Большинство людей пытаются # 2 полагать, что - это шаблон фабричного метода, когда на самом деле # 1 претендует на описание двух основных разновидностей.

Итак, мы на самом деле имеем дело с тремя слегка отличающимися вариантами шаблона в цитируемом тексте, хотя только две из них пронумерованы. Различия между этими версиями основаны на том, сколько информации Creator имеет о том, какую Product реализацию он хочет.

  1. A Creator с abstract Factory Method знает ничего о реализации Product и оставляет все до ConcreteCreator.
  2. A Creator с по умолчанию Factory Method знает, какую реализацию Product он хочет большую часть времени , но не всегда; поэтому он позволяет ConcreteCreator переопределить значение по умолчанию.
  3. A Creator с параметризованным Factory Method имеет меню из Product реализаций на выбор и решает, какую из них запросить. ConcreteCreator for.

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

В шаблоне Factory Method Creator делегирует ответственность за создание объектов своим дочерним классам, потому что " не может предвидеть класс объектов, которые он должен создать. " (стр. 108) Основываясь на различных вариантах, мы можем увидеть, как шаблон немного меняется, когда Creator может ожидать некоторую информацию о классе создаваемых объектов.

Выбор версии зависит от того, как много вы знаете о Product реализациях во время компиляции.

...