При использовании языка, который поддерживает именованные и необязательные аргументы, шаблон компоновщика больше не имеет практического применения?
Строитель:
new Builder(requiredA, requiredB).setOptionalA("optional").Build();
Необязательные / именованные аргументы:
new Object(requiredA, requiredB, optionalA: "optional");
design-patterns
builder-pattern
Павел Никонович
источник
источник
Ответы:
Строители наиболее полезны, когда вашему объекту нужно много аргументов / зависимостей, чтобы быть полезными, или если вы хотите разрешить много разных способов конструирования объекта.
Вдобавок ко всему, я могу представить, что кто-то может захотеть «построить» объекты в 3D-игре, подобной этой:
Я бы сказал, что этот пример более читабелен с помощью методов компоновщика, которые я только что составил, чем с необязательными параметрами:
В частности, информация, подразумеваемая именами методов компоновщика, должна быть заменена еще большим количеством параметров, и гораздо проще забыть об одном параметре в группе тесно связанных параметров. Фактически, фрагментный шейдер отсутствует, но вы не заметите этого, если не будете его искать.
Конечно, если ваш объект принимает от одного до пяти аргументов для создания, нет необходимости вовлекать шаблон компоновщика, независимо от того, были ли у вас именованные / необязательные параметры.
источник
В дополнение к тому, что сказал Ixrec, конструкторы или методы с именованными параметрами не позволят вам перевести ваш объект в готовое состояние, в котором он все еще может быть изменен перед его сборкой. В этом прелесть Builder, где вы можете делегировать части своей конструкции различным методам или классам в целом:
По сути, вы также можете разбрасывать своего сборщика вокруг своей системы до тех пор, пока он не будет готов построить конечный объект, что позволит вам уменьшить объем знаний, необходимых вашему строителю-потребителю.
источник
Это зависит от того, что вы делаете со строителем.
Если вы используете конструктор только для установки (и изменения) свойств объекта и (откладывания) создания объекта, его можно заменить именованными параметрами.
При замене компоновщика у вас может быть компромисс между удобочитаемостью и использованием, который имел в виду @Ixrec (или может не иметь его, это зависит от того, что вы делаете с компоновщиком).
Однако, если ваш конструктор делает больше, чем просто удерживает свойства, и каждый шаг построения включает в себя логику, его нельзя заменить.
MockBuilder - это пример, где его нельзя заменить именованными параметрами. Со страницы:
источник
Шаблон строителя необходим при работе с неизменяемыми объектами. Работа с неизменяемыми объектами имеет множество преимуществ, особенно в том, что ваша программа должна быть более устойчивой к выполнению в параллельной среде (т. Е. Потоках).
источник
new Integer(42)
,new BigDecimal("42.000")
иnew String("foobar")
все конструкторы immutables , что ... ну, строитель был бы неоправданно сложным для этих случаев. Таким образом, сборщик не является обязательным для работы с неизменяемым, когда конструкторы могут работать так же хорошо.