Найти в Дзене
AniNice

Паттерн: Строитель

Суть паттерна Строитель - это порождающие паттерн проектирования, который позволяет создавать сложные объекты пошагово. Строитель дает возможность использовать один и тот же код строительства для получения разных представлений объектов. Представьте сложный объект, требующий кропотливой пошаговой инициализации множества полей и вложенных объектов. Код инициализации таких объектов обычно спрятан внутри монструозного конструктора с десятком параметров. Либо еще хуже - распылен по всему клиентскому коду. Паттерн Строитель предлагает вынести конструирование объекта за пределы его собственного класса, поручив это дело отдельным объектам, называемым строителями. Паттерн предлагает разбить процесс конструирование объекта на отдельные шаги. Чтобы создавать объект, вам нужно поочередно вызывать методы строителя. Причем не нужно запускать все шаги, а только те, что нужны для производства объекта определенной конфигурации. Зачастую один и тот же шаг строительства может отличаться для разных вариац
Оглавление

Суть паттерна

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

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

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

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

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

Директор

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

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

Применимость

Когда вы хотите избавиться от "телескопического конструктора"

Допустим у вас есть один конструктор с десятью параметрами. Его неудобно вызывать, поэтому вы создали еще десять конструкторов с меньшим количеством параметров. Все, что они делают - это переадресуют вызов к базовому конструктору.

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

Когда ваш код должен создавать разные представления какого-то объекта. Например, деревянные и железобетонные дома.

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

Интерфейс строителей определит все возможные этапы конструирования. Каждому представлению будет соотвествовать собственны класс-строитель, а порядок этапов строительства будет задавать класс-директор

Когда вам нужно собираться сложные составные объекты, например, деревья

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

Заметьте, что Строитель не позволяет посторонним объектам иметь доступ к конструируемому объекту, пока тот не будет полностью готов.

Это предохраняет клиентский код от получения незаконченных (битых) объектов.

Шаги реализации

  1. Убедитесь в том, что создание разных представлений объекта можно свести к общим шагам.
  2. Опешите эти шаги в общем интерфейсе строителей.
  3. Для каждого из представлений объекта-продукта создайте по одному классу-строителю и реализуйте их методы строительства.
  4. Подумайте о создании класса директора. Его методы будут создавать различные конфигурации продуктов, вызывая разные шаги одного и того же строителя.
  5. Клиентский код будет создавать и объекты строителей, и объекты директора. Перед началом строительства клиент должен связать определенного строителя с директором. Это можно сделать либо через конструктор, либо через сеттер, либо подав строителя напрямую в строительный метод директора.
  6. Результат строительства можно вернуть из директора, но это если метод возврата продукта удалось поместить в общий интерфейс строителей. Иначе вы жестко привяжете директора к конкретным классам строителей.