2013-04-27 11 views
4

Я рассматриваю использование builder pattern, чтобы создать комплекс objects в моей заявке. Однако я беспокоюсь о том, правильно ли это использовать.Правильное использование рисунка строителя

Take this example; здесь мы видим несколько конкретных PizzaBuilders, которые создают красиво. Однако в моем приложении мне нужна возможность передать некоторую информацию, связанную с тем, что строится. Например, в случае PizzaBuilders мне понадобится возможность создать custom pizza, где пользователь может выбрать определенные вещи, такие как sauce и toppings. Стоит отметить, что информация, которую мне нужно будет передать разработчикам, будет различной.

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

ответ

2

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

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

Взгляните на описание предлагаемого этого шаблона в Эффективной Java Joshua Bloch для более полного объяснения. Here's an article about it

0

Builder is not a grade A pattern, so it's tough to justify its usage sometime. And you might not find convincing reason to use it.

Он используется, если вы хотите, чтобы убедиться, что ваша конструкция объекта является атомарным. Рассмотрим способ Java для создания объекта bean с использованием методов setter. В этом случае проблема заключается в том, что если вы пропустите установку одного атрибута, тогда объект НЕ будет в согласованном состоянии. И нет никакого способа понять это, если вы не получите какое-то непоследовательное поведение приложения.

Таким образом, вы должны использовать шаблон Builder, если есть 3 атрибута, и вы хотите, чтобы создание объекта было атомарным. Я использовал его некоторое время назад, чтобы создать URL REST, например BASE_URL/param1/param2/param3.

Так что если ваше требование о создании/создании объекта, и у вас есть несколько атрибутов, вы можете пойти по этому шаблону.

Редактировать

Что касается реализации; Я придерживался того же подхода, что и в википедии.

2

Например, в случае PizzaBuilders я должен был бы возможность создавать пользовательские пиццы, где пользователь может выбрать определенные вещи, такие как соус и начинку

Можно выбрать - это означает дополнительные элементы. Шаблон Builder был бы идеальным здесь. Если вы не опустите что-то в своем вопросе.

2

Я думаю, вы могли бы использовать что-то вроде:

// normal pizza: 
Pizza normalPizza=PizzaBuilder.aPizza().withCheese().withSalami().build(); 

// custom pizza 
Pizza customPizza=PizzaBuilder.aCustomPizza().withAnchovis().withHotSauce().withExtraCheese().withoutGarlic().build(); 

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

Если вам нужны параметры безопасности для результатов, вы можете использовать buildCustomPizza(), чтобы вернуть свой собственный тип Pizza.