Ответ 1
Я согласен с вашим мнением, что Builder
на самом деле просто прославленный конструктор, и что "шаблон-строитель - это просто способ создания объекта, аналогичного тому, что делает конструктор".
Однако, вот несколько сценариев, в которых сложность построения объекта делает использование Builder
неотразимым.
Зависимости объектов, собранные за период времени
В Java StringBuilder
обычно используется при построении строки в течение определенного периода времени или, вернее, в рамках сложной процедуры. Например, если сервер взаимодействует с клиентом по сокету и хочет добавить некоторые ответы клиента на строку, но не другие, и, возможно, удалить определенные ответы, которые были ранее добавлены, класс StringBuilder
может использоваться для выполнения так. В конце сеанса клиент/сервер сервер может вызвать StringBuilder#toString
, чтобы получить построенный String
.
Множество параметров
Если конструктор имеет десятки параметров, он может сделать код более читабельным или удобным для использования, чтобы использовать построитель.
например.
Foo(1,2,3,4,5,6,7,8,9,10,11,12)
Vs.
new Foo.Builder()
.bar(1)
.bar(2)
.quux(3)
...
.build()
Построение графов объектов
Подобно сценарию "множество параметров", я считаю, что сценарий, в котором строитель является наиболее привлекательным, заключается в построении сложного графа объектов. Другие ответы в этом вопросе касаются телескопического анти-шаблона. Этот сценарий (построение графа сложных объектов) может привести к "телескопированию", который помогает Builder
.
Например, представьте, что у вас есть объектно-ориентированный интерфейс конвейера, где Pipeline
зависит от Sequence
, который зависит от Stage
. A PipelineBuilder
не только обеспечит хорошую оболочку вокруг конструктора Pipeline
, но и вокруг конструкторов Sequence
и Stage
, что позволит вам составить сложный Pipeline
из одного интерфейса Builder
.
Вместо конструкторов телескопирования:
new Pipeline(
new Sequence(
new Stage(
new StageFunction() {
public function execute() {...}
}
),
new Stage(
new StageFunction() {
public function execute() {...}
}
)
)
)
A PipelineBuilder
позволит вам "свернуть" телескоп.
new Pipeline.Builder()
.sequence()
.stage(new StageFunction () {
public function execute() {...}
})
.stage(new StageFunction () {
public function execute() {...}
})
.build()
(Несмотря на то, что я использовал отступ таким образом, который отражает конструкторы телескопа, это просто косметическое, а не структурное.)