Где Вы использовали бы разработчика Pattern вместо Абстрактной Фабрики?

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

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

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

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

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


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

Часто, проекты начинают использовать Метод фабрики (менее сложные, более настраиваемые, подклассы распространяются), и развейтесь к Абстрактной Фабрике, Прототипу или Разработчику (более гибкий, более сложный), поскольку разработчик обнаруживает, где больше гибкости необходимо.

Если бы это так, какая сложность должна была бы быть представлена в Вашей системе, где Вы изменитесь от Абстрактной Фабрики до Разработчика?

Моя точка - то, что я не могу найти и пример, где ясно, что Абстрактная Фабрика не будет достаточна, и Вам был бы нужен Разработчик вместо этого.

23
задан Aaron 23 December 2009 в 18:44
поделиться

8 ответов

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

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


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

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

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


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

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

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

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

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

13
ответ дан 29 November 2019 в 02:36
поделиться

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

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

1
ответ дан 29 November 2019 в 02:36
поделиться

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

Фактически, вы можете смешивать два паттерна. Например, Java DocumentBuilderFactory является классической абстрактной фабрикой: если вы прочитаете документацию, вы увидите процесс, который она использует для выбора реализации. Однако,

2
ответ дан 29 November 2019 в 02:36
поделиться

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

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

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

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

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

7
ответ дан 29 November 2019 в 02:36
поделиться

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

setName()
setType()
setOption()

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

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

.
4
ответ дан 29 November 2019 в 02:36
поделиться

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

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

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

.
2
ответ дан 29 November 2019 в 02:36
поделиться
..

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

0
ответ дан 29 November 2019 в 02:36
поделиться

Давайте рассмотрим аналогию.

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

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

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

1
ответ дан 29 November 2019 в 02:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: