Я собираюсь начать серию статей, объясняющих паттерны проектирования на примерах кода Java. Это может быть полезно для всех, кто хочет погрузиться в эти распространенные методы проектирования ООП. Лучший способ освоить что-либо — это практиковаться.
Строитель
Builder — это творческий шаблон проектирования, который предоставляет альтернативный способ построения сложных объектов. Этот шаблон следует использовать, когда мы хотим создавать разные неизменяемые объекты, используя один и тот же процесс построения объектов.
Шаблон "Строитель" направлен на "отделение построения сложного объекта от его представления, чтобы один и тот же процесс построения мог создать несколько разных представлений".
Теперь предположим, что нам нужно создать объект Employee
, который имеет следующие 5 атрибутов, т. е. firstName
, secondName
, yearOfBirth
, employeeId
, registrationAddress
.
А что если только firstName
,secondName
, employeeId
являются обязательными, а остальные поля необязательными? Нам нужно больше конструкторов:
Эта проблема называется проблемой телескопических конструкторов. Только представьте, сколько конструкторов потребуется для большего количества атрибутов.
Паттерн Builder может быть описан в классе, который имеет один метод создания и несколько методов для настройки результирующего объекта. Методы компоновщика часто поддерживают цепочку, например ObjectBuilder()->attrubute1(1)->attribute2(2)->build()
).
Валидации полей для краткости опущены (если значение поля недействительно, следует выбросить IllegalArgumentException
). Имейте в виду, что созданный выше объект не имеет никакого метода установки, поэтому его состояние нельзя изменить после его создания. Это обеспечивает желаемую неизменность.
Использование шаблона:
Аннотация Ломбок @Builder
@Builder проекта Lombok — это простой способ использования шаблона без написания шаблонного кода. Вот пример:
И пример использования в коде:
Заключение
Плюсы строительного шаблона
- Гибкость дизайна и гораздо более читаемый код.
- Параметры конструктора сокращены и предоставляются в хорошо читаемых цепочках вызовов методов. Таким образом, нет необходимости передавать
null
для необязательных параметров конструктору при создании экземпляра класса. - Экземпляр всегда создается в завершенном состоянии.
- Мы можем создавать неизменяемые объекты без особой сложной логики в процессе создания объектов.
Минусы шаблона Builder
- Шаблон требует много кода
Используйте шаблон Builder, когда
- Алгоритм создания сложного объекта не должен зависеть от частей, из которых состоит объект, и способа их сборки.
- Процесс построения должен допускать различные представления для создаваемого объекта.
Использование Builder в основных библиотеках Java:
Чтобы увидеть более подробную информацию о приведенных примерах кода, посетите мой репозиторий Design-Patterns на GitHub.