Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Использование паттерна 'Builder'

#java #шаблоны_проектирования


Для чего нужен паттерн программирования Builder? Как написано в некоторых учебниках,
он используется для того чтобы предотвратить создание конструкторов для сетера всех
вариантов филдов.

Как альтернатива используется внутренний класс Builder, в котором дублируются все
филды с дефолтными значениями. В классе есть сеттеры всех филдов.

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

private Double emission = 0d;
...


Соответственно если нужный сеттер не вызван, будет использоваться дефолтное значение?
    


Ответы

Ответ 1



Билдеры необходимы, когда у вас есть класс: содержащий много полей поля иммутабельны (final) не все поля обязательны Делать конструкторы под все варианты или один конструктор, скажем с 10-ю параметрами, неудобно. Еще бывает ситуация когда есть некий процесс, на протяжении которого нужно наполнить объект данными (при чем при разных условиях какие-то поля могут быть задействованы, а какие-то - нет), а после этого отдать его иммутабельную версию. В таком случае удобно протаскивать по ходу процесса builder, а когда все будет готово - завершить сборку.

Ответ 2



Паттерн Builder очень часто используется в тех случаях когда у конструируемого объекта множество полей. Он позволяет более информативнее и удобнее передавать значения, например: class People { final String name; final String surname; final String city; final Sex sex; final int age; public People(String name, String surname, String city, Sex sex, int age) { this.name = name; this.surname = surname; this.city = city; this.sex = sex; this.age = age; } } Конструктор получается довольно раздутым. При передаче параметров легко ошибиться и перепутать порядок, например, имени и фамилии. Так же, тут нельзя учесть, дефолтные значения. С Builder'ом, код будет выглядеть более лаконичнее: People man = People .builder() .withName("Artem") .withSurname("Konovalov") .sex(MALE) .age(25) .liveIn("Saratov") .build();

Комментариев нет:

Отправить комментарий