Разница между шаблоном строителя и конструктором

Я делаю презентацию о шаблоне построителя, и я уверен, что меня спросят, в чем разница между шаблоном построителя и конструктором.

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

Ответ 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()

(Несмотря на то, что я использовал отступ таким образом, который отражает конструкторы телескопа, это просто косметическое, а не структурное.)

Ответ 2

На странице Wikipedia:

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

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

например. Я мог бы создать несколько разных конструкторов для объекта, или я мог бы сделать следующее:

new ObjectBuilder().withParam1(1).withParam4(4).withParam19(19).build();

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

Ответ 3

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

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