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

Где бы вы использовали шаблон Builder вместо абстрактного Factory?

Я видел, как этот вопрос поднимался здесь и там несколько раз, но я не нашел и не ответил, что был доволен.

Из Википедии:

Builder фокусируется на построении сложного объекта шаг за шагом. Аннотация Factory подчеркивает семейство объектов продукта (простых или сложных). Builder возвращает продукт в качестве последнего шага, но в отношении абстрактного Factory продукт немедленно возвращается.

Но для клиента это не то же самое? Он получает полный объект после его создания, поэтому для него нет добавленной функциональности.

Единственный способ, которым я это вижу, - это как способ или организация кода конструктора пошагово, чтобы создать структуру для реализации строителей. Это хорошо, но едва ли отличный шаг от абстрактного factory.


Этот следующий бит из Википедии является хорошей ссылкой, чтобы перейти к моей точке:

Часто проекты начинаются с использования метода Factory (менее сложные, настраиваемые, подклассы размножаются) и развиваются в направлении Abstract Factory, Prototype или Builder (более гибкие, более сложные), поскольку разработчик обнаруживает, где больше гибкости необходимо.

Если это так, какая сложность должна быть введена в вашей системе, где вы бы изменились с абстрактного Factory на Builder?

Моя точка зрения заключается в том, что я не могу найти и пример, где ясно, что абстрактного Factory не будет достаточно, и вам понадобится Builder вместо этого.

4b9b3361

Ответ 1

The AbstractFactory относится к семейству связанных продуктов. Builder предназначен для одного продукта.

Builder предназначен для создания сложного продукта шаг за шагом, а AbstractFactory - абстрактным способом (то есть для нескольких реализаций) - менее сложным продуктом.


Примеры того, что означает различие для вызывающего кода:

  • Для кода клиента с использованием AbstractFactory, каждый вызов метода строит один объект. Клиент должен собрать их вместе. С другой стороны, строитель собирал их изнутри и доставлял полный граф объектов в качестве последнего шага здания.

  • Конструктор позволяет передавать и проверять параметры один за другим для кода клиента. Но он может построить конечный продукт за один шаг (например, вызов конструктора, передающий сразу все параметры, даже сложные, которые были созданы сами). Таким образом, продукт строителя может быть неизменным объектом (или графиком) (что бесценно в многопоточной среде по причинам производительности и памяти).


ОБНОВЛЕНО в ответ на этот комментарий:

Лино > Это все равно беспокоит меня, хотя:). Я имею в виду, если вы строите составные объекты, и вы берете директора, передавая ответственность за вызов методов строителя для клиентов, тогда он работает для меня. Только тогда строитель будет выглядеть идеально. Но с режиссером это не похоже на многое...

Точно, Builder не имеет директора, он позволяет каждому клиенту создавать сложный продукт в соответствии с его конкретными потребностями. Клиент является директором, потому что реализация директора не используется повторно.

Если вам нужно многократно использовать сложный процесс построения, тогда у вас может быть метод для инкапсуляции (и этот метод является вашим "директором" ).

Наоборот, для AbstractFactory вам обычно нужен многоразовый директор, который создает продукты как (с реализацией Factory).

Ответ 2

Некоторые очень хорошие ответы здесь уже есть. Я просто предлагаю аналогию.

Скажите, что вам нужен новый стол для вашего нового офиса. Вы перейдете к "factory" и увидите выбор, затем выберите одну из полки. Если это соответствует вашим потребностям, отлично!

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

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

Хорошо, хромая история, но просто для облегчения: P

Ответ 3

Один хороший пример, где вы хотите, чтобы строитель был, если вы строили что-то по частям на основе аргументов командной строки. Например, рассмотрите построитель с такими методами, как...

setName()
setType()
setOption()

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

Иногда эстетика одного рисунка просто лучше, чем эстетика другого.

Ответ 4

Builder полезен для конфигурации. Абстрактный Factory полезен, когда вы не хотите, чтобы вызывающие абоненты заботились о фактической реализации. Две разные цели.

На самом деле вы могли бы смешивать два шаблона. Например, Java DocumentBuilderFactory является классическим абстрактом factory: если вы читаете документы, вы увидите процесс, который он использует для выберите реализацию. Тем не менее, DocumentBuilder, который он производит, может быть настроен позже (хотя они не следуют прототипному подходу "строитель" к каждой конфигурации метод возвращает настроенный объект).

Ответ 5

Builder - это инверсия элемента управления, например шаблон шаблона шаблона. Различные функции на вашем конкретном строителе - это настраиваемые этапы процесса. Абстрактный Factory - это "просто" полиморфизм, где выход является новопостроенным объектом. Различные функции на конкретном Factory - это разные настраиваемые процессы, каждый из которых, по-видимому, приводит к другому объекту.

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

Я думаю, что вы могли бы использовать оба сразу: с абстрактным Factory, действующим как режиссер в шаблоне Builder, и каждый конкретный Factory направляет вещи по-другому. Однако это выходит за пределы предела "салфетки" для UML-диаграмм; -)

Ответ 6

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

Я не уверен, что это правильное использование, но я видел, как это было сделано, и как я это делал в прошлом.

Ответ 7

Рассмотрим аналогию.

Вы находитесь в сети быстрого питания, где фаст-фуд, который вы на самом деле получаете, довольно сложный. Это не только сложно, но только определенные люди могут принять ваш заказ за определенные виды пищи. Теперь вы этого не знаете, потому что менеджер магазина решил поставить одного человека за один кассовый аппарат. Но если вы внимательно посмотрите на него, это на самом деле передовая голограмма, потому что она "абстрактна". Реферат. Теперь, когда вы разговариваете с голограммой и размещаете свой заказ, компьютер-голографический компьютер перенаправляет (полиморфизм), который заказывает имплантат в мозг человека, ищущего порядок. Имплантат делает человека действительно ударом в порядке реального реестра. Некоторые из этих "конкретных" людей, контролируемых разумом, заказываются голограммой. Теперь, когда настоящий человек ударяет в порядке, он отправляется на компьютер сзади, где есть конвейер или "строитель" для каждого типа создаваемой пищи. Заказы отправляются на различные виды сборочных линий на основе человека и его кассового аппарата.

Итак, голограмма является абстрактным factory, люди с контролируемым сознанием в регистрах - это конкретные заводы, а сборочные линии - строители. Это способ визуализации потока абстрактного factory, работающего с шаблоном построителя. Иногда лучше всего видеть, как шаблоны проектирования работают вместе, чтобы увидеть, как они отличаются.

Если вы ищете дополнительный кредит, попробуйте реализовать это с помощью дженериков. Это не требует такого кода, как вы думаете.

Ответ 8

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

Ответ 9

На практике вы, вероятно, будете использовать DI + IOC, чтобы делать то, что раньше делал строитель. FYI.

Ответ 10

Хорошие ответы, хотелось бы добавить мое в надежде, что я обнаруживаю, что мое понимание верное.

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

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