Skip to content
Aleksandr Kuchuk edited this page Jul 5, 2016 · 1 revision

##Введение. Пусть у нас есть некоторый класс. У класса - много параметров.

Пусть у нас для примера есть некая сущность телефона - Telephone, у него есть серийный номер, имя, марка и т.д

Какие возможные варианты есть для работы с таким классом в Java?

###Telescoping constructor pattern С данным подходом мы пишем какое-то количество конструкторов, там заполняем обязательные и необязательные параметры. Telescoping Pattern

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

Поэтому при работе с классами имеющими большое количество параметров лучше не использовать его.

Java Beans pattern

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

javabean example

Builder Pattern

Как же соединить два эти подхода, но так, чтобы мы обходили недостатки каждого, а использовали бы плюсы? Суть заключается в том, что мы создаем внутренний класс, часто называемый Builder, через которого выставляем параметры, а после делаем build(). Т.е пока мы не сделали build - мы работаем с промежуточным объектом.

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

Можно по разному сделать Builder и поэтому внизу - два примера.

First Example

Second Example

Читать и работать с таким кодом гораздо проще, чем при использовании Telescoping, а также безопаснее, чем при использовании Java Beans.

Примеры использования каждого паттерна: Examples

Clone this wiki locally