-
Notifications
You must be signed in to change notification settings - Fork 3
Builder pattern
##Введение. Пусть у нас есть некоторый класс. У класса - много параметров.
Пусть у нас для примера есть некая сущность телефона - Telephone, у него есть серийный номер, имя, марка и т.д
Какие возможные варианты есть для работы с таким классом в Java?
###Telescoping constructor pattern С данным подходом мы пишем какое-то количество конструкторов, там заполняем обязательные и необязательные параметры. Telescoping Pattern
При создании класса мы вынуждены перечислить все в выбранном конструкторе. Если полей действительно много, то это - потенциальное место для ошибки. Т.е этот подход хорош тогда, когда класс не имеет огромное количество параметров, так как иначе такой код сложно читать и использовать такой класс. Надо высчитывать позицию параметра, держать в уме что означает каждое число/строка/объект переданный и т.д. Если мы передаем много строк - то если мы перепутаем строки - наш код скомпилируется, будет ошибка, которую тяжело будет потом отловить.
Поэтому при работе с классами имеющими большое количество параметров лучше не использовать его.
Тут мы создаем объект, вызывая конструктор без параметров, а после уже устанавливаем значения set-рами. Такой код проще читать, однако из-за разделения вызовов мы имеем объект, который некоторое время находится в неустойчивом состоянии(пока там эти все set-ры выполняются объект находится в полуподвешенном состоянии). Также такой объект не может быть неизменным.
Как же соединить два эти подхода, но так, чтобы мы обходили недостатки каждого, а использовали бы плюсы?
Суть заключается в том, что мы создаем внутренний класс, часто называемый Builder, через которого выставляем параметры, а после делаем build()
. Т.е пока мы не сделали build - мы работаем с промежуточным объектом.
Благодаря этому подходу мы можем конструировать наш объект в нужном порядке, более тонкий контроль над процессом конструирования, изолирует код, реализующий конструирование и представление.
Можно по разному сделать Builder и поэтому внизу - два примера.
Читать и работать с таким кодом гораздо проще, чем при использовании Telescoping, а также безопаснее, чем при использовании Java Beans.
Примеры использования каждого паттерна: Examples