Пользователь Нина Можарская
Нина Можарская
17 уровень
Киев

Паттерн (Шаблон) Builder

Статья из группы Random
Этот шаблон рекомендуется использовать, когда класс имеет большое количество однотипных параметров и трудно запомнить их порядок и назначение.
Паттерн (Шаблон) Builder - 1

public class Good{
   public final int a;
   public final int b;
   public final int c;
   public final int d;
   public final int e;
   public final int f;
//Реализация Builder через статический внутренний класс
public static class Builder{
//Обязательные параметры
    public int a;
    public int b;
//Необязательные параметры со значениями по умолчанию
public int c = 0;
public int d = 0;
public int e = 0;
public int f = 0;
//Конструктор с обязательными параметрами
public Builder(int a, int b){
this.a=a;
this.b=b;
}
//Методы с возвращающим типом Builder для необязательного параметра с, d, e, f,
  public Builder c (int val) {
            c = val;
            return this;
        }
  public Builder d (int val) {
            d = val;
            return this;
        }
  public Builder e (int val) {
            e = val;
            return this;
        }
  public Builder f (int val) {
            f = val;
            return this;
        }
//Метод с возвращающим типом Good для генерации объекта
public Good buidl() {
            return new Good (this); }
private Good(Builder builder) {
        a = builder.a;
        b = builder.b;
        c = builder.c;
        d = builder.d;
        e = builder.e;
        f = builder.f;     }
Теперь в методе main при создании объекта вызывается конструктор статического класса Builder с обязательными параметрами. Затем через точку вызываются все необходимые необязательные параметры. В завершение вызывается метод buidl(); для генерации объекта.

Good good = new Good.Builder(40, 20)
        .c(2)
        .d(4)
        .e(23)
        .f(9)
        .buidl();
Если хочу создать объект с двумя обязательными и одним необязательным параметром, это будет выглядеть так:

Good good = new Good.Builder(40, 20)
        .c(2)
        .buidl();
Если хочу создать объект только с двумя обязательными параметрами, это выглядет так:

Good good = new Good.Builder(40, 20)
         .buidl();
Комментарии (17)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Александр Палеков 28 уровень, Витебск
27 января 2021
это всё хорошо, но приведенный пример кода не работает, ибо пропущены две скобки, закрывающие классы...
On Girame 20 уровень, Москва
17 декабря 2020
а пропущенные необязательные параметры будут тоже созданы с дефолтным значением?
On Girame 20 уровень, Москва
17 декабря 2020
а нельзя как с# уже сделать необязательные аргументы в конструкторе и методе?
Pavlo Buidenkov 41 уровень
13 июня 2020
статья ок, но не может не резать глаз 1. перекошенное форматирование кода (забыли выровнять код в своей IDE ) 2. слово в названии медода "build" с опечаткой "buidl"
Artem Murk 35 уровень, Днепр
20 октября 2018
К сожалению данная статья не раскрывает полной красоты и функциональности данного шаблона. Не раскрыты также недостатки, описание очень скудное. Рекомендую автору погуглить и переделать статью. Что можно улучшить на первый взгляд. 1) привести пару реальных примеров где можно применить шаблон. Возможно есть примеры из уже существующих библиотек, вставить их. 2) описать преимущества и недостатки. 3) Передлать и дополнить назначение шаблона. Он в основном используется для конструирования сложных объектов.
Kupnu4 26 уровень, Киев
16 октября 2018
Интересный шаблон, классный пример. Теперь не надо создавать множество конструкторов и запоминать в каком конструкторе какой параметр за что отвечает.
Vania Kostiuk 6 уровень, Киев
15 октября 2018
Гарний шаблон. Все наглядно розписано.
Mihail Tymoshenko 0 уровень
14 октября 2018
Хорошая статья. Отличный паттерн, очень понятное создание сложных объектов
Мария 2 уровень
13 октября 2018
Благодаря паттерну теперь не приходится заморачиваться и скролить, чтобы посмотреть и припомнить назначения параметров! Однозначно полезный шаблон, буду использовать!
Алексей 0 уровень, Киев
13 октября 2018
Очень полезный пример! Спасибо