В чем разница между шаблоном Builder Design и шаблоном Factory Design? - PullRequest
561 голосов
/ 16 апреля 2009

В чем разница между шаблоном проектирования Builder и шаблоном проектирования Factory?

Какой из них более выгоден и почему?

Как мне представить мои результаты в виде графика, если я хочу проверить и сравнить / сопоставить эти образцы?

Ответы [ 24 ]

4 голосов
/ 06 февраля 2018
+-------------------------------------------------------------------+---------------------------------------------------+
|                              Builder                              |                      Factory                      |
+-------------------------------------------------------------------+---------------------------------------------------+
| Return only single instance to handle complex object construction | Retrun various instances on multiple constructors |
| No interface required                                             | Interface driven                                  |
| Inner classes is involved (to avoid telescopic constructors)      | Subclasses are involved                           |
+-------------------------------------------------------------------+---------------------------------------------------+  

Телескопическая модель конструктора

Аналогия:

  • Фабрика: Рассмотрим ресторан. Создание «сегодняшней еды» - это фабричный шаблон, потому что вы говорите кухне «принесите мне сегодняшнюю еду», а кухня (фабрика) решает, какой объект генерировать, основываясь на скрытых критериях.
  • Строитель: Строитель появляется, если вы заказываете специальную пиццу. В этом случае официант говорит шеф-повару (строителю): «Мне нужна пицца; добавь в нее сыр, лук и бекон!» Таким образом, строитель предоставляет атрибуты, которые должен иметь сгенерированный объект, но скрывает, как их устанавливать.

Предоставлено

3 голосов
/ 06 января 2016

Абстрактный шаблон Фабрика и Строитель - оба являются Творческими шаблонами, но с разным намерением.

Абстрактный шаблон фабрики подчеркивает создание объектов для семейств связанных объектов, где:

  • Каждое семейство - это набор классов, производных от общего базового класса / интерфейса.
  • Каждый объект возвращается сразу в результате одного вызова.

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

  • Объект Builder инкапсулирует конфигурацию сложного объекта.
  • Объект Director знает протокол использования Builder, где Протокол определяет все логические шаги, необходимые для построения сложного объекта.
2 голосов
/ 04 марта 2018

Сложная конструкция - это когда конструируемый объект состоит из других объектов, представленных абстракциями.

Рассмотрим меню в McDonald's. Меню содержит напиток, основное и боковое. В зависимости от того, какие потомки отдельных абстракций составлены вместе, созданное меню может иметь другое представление.

  1. Пример: кола, биг мак, картофель фри
  2. Пример: спрайт, самородки, кудрявый картофель фри

Там мы получили два экземпляра меню с разными представлениями. Процесс строительства в свою очередь остается прежним. Вы создаете меню с напитком, основным и боковым.

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

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

1 голос
/ 16 сентября 2016

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

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

Возможно, эта точка будет точкой перехода. Переход от Фабрики к Строителю. Таким образом, вы создаете модуль-обертку вокруг параметров построения , а затем вы сможете представлять новые (похожие) объекты, добавляя еще несколько абстракций (возможно) и реализации, не затрагивая фактическую логику создания. Итак, у вас была менее сложная логика и перекомпилированный исходный код

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

1 голос
/ 02 сентября 2013

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

Здесь класс построителя действует как посредник между основным классом и классами определенного типа. Больше абстракции.

1 голос
/ 30 сентября 2015

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

0 голосов
/ 24 декабря 2018

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

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

0 голосов
/ 16 января 2013

Строитель и абстрактная фабрика

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

Общий интерфейс для продуктов

На практике продукты, созданные бетоностроителями, имеют существенно различную структуру, поэтому, если нет причин выводить разные продукты, общий родительский класс. Это также отличает шаблон Builder от шаблона Abstract Factory, который создает объекты, производные от общего типа.

От: http://www.oodesign.com/builder-pattern.html

0 голосов
/ 05 ноября 2017

ИМХО

Строитель - это более сложная фабрика.

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

Таким образом, говоря об эволюции «Творческих паттернов» по ​​сложности, вы можете думать об этом следующим образом:

Dependency Injection Container -> Service Locator -> Builder -> Factory
0 голосов
/ 11 июня 2013

Шаблон сборки подчеркивает сложность создания объекта (решается "шагами")

Абстрактный узор подчеркивает "просто" на "абстракции" (нескольких, но связанных) объектов.

...