Когда бы вы использовали шаблон Builder? [закрыто]

Ponder - библиотека отражения C ++, отвечая на этот вопрос. Я рассмотрел варианты и решил сделать свой собственный, так как я не мог найти тот, который отмечен всеми моими коробками.

Хотя есть большие ответы на этот вопрос, я не хочу использовать тонны макросов или полагаться на Boost. Boost - отличная библиотека, но есть много небольших проектов на C ++ 0x, которые проще и имеют более быстрое время компиляции. Есть также преимущества для того, чтобы украсить класс извне, например, обернуть библиотеку C ++, которая еще не поддерживает C ++ 11. Это fork CAMP, используя C ++ 11, что больше не требует Boost .

495
задан Flow 28 September 2014 в 16:50
поделиться

9 ответов

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

Одним примером использования разработчика является здание XML-документ, я использовал эту модель при создании фрагментов HTML, например, у меня мог бы быть Разработчик для создания определенного типа таблицы, и это могло бы иметь следующие методы (параметры не показывают) :

BuildOrderHeaderRow()
BuildLineItemSubHeaderRow()
BuildOrderRow()
BuildLineItemSubRow()

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

Выезд Шаблон Разработчика на Википедию .

246
ответ дан Ajay 28 September 2014 в 16:50
поделиться

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

3
ответ дан wasker 28 September 2014 в 16:50
поделиться
  • 1
    Совместно используйте свой опыт с любой из библиотек, которые Вы пробуете. I' m поиск того также, таким образом, было бы полезно услышать о Ваших событиях. – stiank81 3 September 2009 в 08:34

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

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

312
ответ дан Pops 28 September 2014 в 16:50
поделиться

Вы используете его, когда у Вас есть много опций иметь дело с. Думайте о вещах как jmock:

m.expects(once())
    .method("testMethod")
    .with(eq(1), eq(2))
    .returns("someResponse");

Это чувствует себя намного более естественным и... возможно.

существует также xml здание, строковое здание и много других вещей. Вообразите, поместил ли java.util.Map как разработчик. Вы могли сделать материал как это:

Map<String, Integer> m = new HashMap<String, Integer>()
    .put("a", 1)
    .put("b", 2)
    .put("c", 3);
8
ответ дан Dustin 28 September 2014 в 16:50
поделиться

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

мы могли использовать фабрику вместо этого? Да

, Почему не сделал нас? Разработчик имеет больше смысла, который я предполагаю.

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

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

10
ответ дан Cameron MacFarland 28 September 2014 в 16:50
поделиться

Основываясь на предыдущих ответах (предназначенная игра слов), превосходный реальный пример Groovy, созданный в поддержке Builders.

См. Разработчики в Документация Groovy

6
ответ дан Laurel 28 September 2014 в 16:50
поделиться
  • 1
    Спасибо за продолжение. Я думаю, OpenDICOM активно не сохраняется. Steve рекомендует ClearCanvas, позвольте мне попробовать это. mydicom.net, кажется, является дорогостоящим на место разработчика. –  26 August 2009 в 17:55

. СЕТЕВОЙ класс StringBuilder является ярким примером шаблона разработчика. Это главным образом используется для создания строки в серии шагов. Конечным результатом Вы входите в выполнение ToString () всегда является строка, но создание той строки варьируется согласно тому, какие функции в классе StringBuilder использовались. Таким образом, основная идея состоит в том, чтобы создать сложные объекты и скрыть детали реализации того, как она создается.

18
ответ дан 29 September 2014 в 03:50
поделиться

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

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

Кроме того, существует множество разновидностей построителя. Наемник-камикадзе дает еще один.

6
ответ дан 22 November 2019 в 22:33
поделиться

Ниже приведены некоторые аргументы в пользу использования шаблона и примера кода на Java, но это реализация шаблона сборщика, охваченная Gang of Four в Design Patterns. Причины, по которым вы бы использовали его в Java, также применимы и к другим языкам программирования.

Как утверждает Джошуа Блох в Effective Java, 2-я редакция :

Шаблон конструктора является хорошим выбором при проектировании классов, конструкторы или статические фабрики которых имели бы более чем горстку параметров.

В какой-то момент мы все столкнулись с классом со списком конструкторов, в котором каждое добавление добавляет новый параметр опции:

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }

Это называется Telescoping Constructor Pattern (Телескопическая модель конструктора). Проблема с этой моделью заключается в том, что когда длина конструкторов составляет 4 или 5 параметров, становится трудно запомнить требуемый порядок параметров , а также какой конкретный конструктор вы можете захотеть в данной ситуации.

Одна из альтернатив , которую вы должны использовать в телескопическом конструкторе, это JavaBean Pattern , где вы вызываете конструктор с обязательными параметрами, а затем вызываете любые опциональные уставки:

Pizza pizza = new Pizza(12);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);

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

Лучшей альтернативой является использование Builder Pattern.

public class Pizza {
  private int size;
  private boolean cheese;
  private boolean pepperoni;
  private boolean bacon;

  public static class Builder {
    //required
    private final int size;

    //optional
    private boolean cheese = false;
    private boolean pepperoni = false;
    private boolean bacon = false;

    public Builder(int size) {
      this.size = size;
    }

    public Builder cheese(boolean value) {
      cheese = value;
      return this;
    }

    public Builder pepperoni(boolean value) {
      pepperoni = value;
      return this;
    }

    public Builder bacon(boolean value) {
      bacon = value;
      return this;
    }

    public Pizza build() {
      return new Pizza(this);
    }
  }

  private Pizza(Builder builder) {
    size = builder.size;
    cheese = builder.cheese;
    pepperoni = builder.pepperoni;
    bacon = builder.bacon;
  }
}

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

Pizza pizza = new Pizza.Builder(12)
                       .cheese(true)
                       .pepperoni(true)
                       .bacon(true)
                       .build();

В результате получается код, который легко писать и очень легко читать и понимать. В этом примере метод сборки можно модифицировать для проверки параметров после их копирования из конструктора в объект Pizza и бросить IllegalStateException, если было введено недопустимое значение параметра. Этот паттерн гибкий и его легко добавить в будущем. Она действительно полезна только в том случае, если у вас будет более 4 или 5 параметров для конструктора. Тем не менее, если вы подозреваете, что в будущем вы будете добавлять больше параметров, то, возможно, в первую очередь стоит .

Я много позаимствовал на эту тему из книги Effective Java, 2-е издание Джошуа Блоха. Чтобы узнать больше об этом шаблоне и других эффективных методах работы Java я настоятельно рекомендую его.

983
ответ дан 22 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

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