Рубрики
Без рубрики

Шаблон проектирования Advanced Builder — Java

Существует класс, который содержит множество переменных внутри конструктора. Предположим, у нас есть класс Student, и в нем есть конструктор, содержащий 10 переменных разных типов. Когда один из членов команды захочет создать объект класса, он столкнется с некоторыми трудностями из-за большого количества переменных. Помечено java, шаблонами проектирования, продвинутыми шаблонами.

Каждый шаблон проектирования предназначен для решения хорошо известной проблемы. Шаблон проектирования конструктора Проблема в том, что внутри конструктора есть класс, в котором много переменных. Предположим, у нас есть класс Student, и в нем есть конструктор, содержащий 10 переменных разных типов. Когда один из членов команды захочет создать объект класса, он столкнется с некоторыми трудностями из-за большого количества переменных.

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

Мы хотим применить шаблон проектирования Builder к примеру Student.

ученик публичного класса {

private int id;
private String name;
private String major;
private String mobileNumber;
private double salary;

// Optional Private Constructor
pu Student(int id, String name, String major, String mobileNumber) {
    this.id = id;
    this.name = name;
    this.major = major;
    this.mobileNumber = mobileNumber;
}


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getMajor() {
    return major;
}

public void setMajor(String major) {
    this.major = major;
}

public String getMobileNumber() {
    return mobileNumber;
}

public void setMobileNumber(String mobileNumber) {
    this.mobileNumber = mobileNumber;
}

public double getSalary() {
    return salary;
}

public void setSalary(double salary) {
    this.salary = salary;
}

}

Чтобы применить шаблон проектирования Builder, нам нужен новый класс для сбора переменных данных, и после того, как пользователь заполнит все данные параметров, мы создадим объект из класса Student поэтому нам нужно объявить класс ‘SimpleStudentBuilder’.

  • Нам нужно объявить этот класс ‘SimpleStudentBuilder’ внутренним в классе Student, потому что нам нужно изменить конструктор Student на закрытый и внутренний класс, мы можем инициализировать новый объект формы Student.

  • Нам также нужно объявить ‘SimpleStudentBuilder’ статическим, потому что мы можем использовать его из внешнего класса, а не инициализировать объект от студента:)

//Этот класс находится в студенческом классе

публичный статический класс Простой Конструктор учащихся {

private int id;
private String name;
private String major;
private String mobileNumber;
private double salary;


public SimpleStudentBuilder() {
}

public SimpleStudentBuilder setId(int id) {
    this.id = id;
    return this;
}

public SimpleStudentBuilder setName(String name) {
    this.name = name;
    return this;
}

public SimpleStudentBuilder setMajor(String major) {
    this.major = major;
    return this;
}

public SimpleStudentBuilder setMobileNumber(String mobileNumber)     {
    this.mobileNumber = mobileNumber;
    return this;
}

public SimpleStudentBuilder setSalary(double salary) {
    this.salary = salary;
    return this;
}

public Student build() {
    // TODO : Check All Require Parameters is not null
    if (id == 0)
        throw new NullPointerException("Id Can't be with out value");

    if (name == null)
        throw new NullPointerException("Name Can't be Null");

    if (major == null)
        throw new NullPointerException("Major Can't be Null");

    if (mobileNumber == null)
        throw new NullPointerException("Number Can't be Null");

    Student student = new Student(id, name, major, mobileNumber);
    student.salary = salary;

    return student;
}

}

вы можете показать полный код в репозитории GitHub.

общедоступный статический void main(строка[] аргументы) {

Student student = new Student.SimpleStudentBuilder()
        .setMajor("IT")
        .setName("Kareem Radwa")
        .setMobileNumber("0597190510")
        .setSalary(1000)
        .setId(32)
        .build();

}

Предположим, что в конструкторе Student у нас есть приоритет при передаче значений параметров, например, в порядке [ идентификатор, имя, специальность, номер мобильного телефона ] Если это расположение исчезнет, вы не сможете создать объект из класса Student.

поэтому нам нужно ответить на эту ситуацию ответом является Пошаговый конструктор, но как мы можем реализовать этот ответ. продолжайте читать:)

Чтобы применить эту идею тебе нужно

Несколько интерфейсов с одинаковым количеством требуемых переменных, поэтому в нашем примере класса Student нам нужно 4 интерфейса и, кроме того, нам нужен еще один интерфейс для метода сборки и дополнительных переменных. В классе реализованы все вышеперечисленные интерфейсы, нам нужны подписи к этим “Шагам”

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

строитель шагов ученика публичного класса {

public static IdFiled newBuilder() {

    return new Steps();

}


public static interface IdFiled {
    NameFiled setId(int id);
}

public static interface NameFiled {

    MajorFiled setNmae(String name);

}

public static interface MajorFiled {

    MobileNumber setMajor(String major);

}

public static interface MobileNumber {

    BuildStep setMobile(String mobile);

}


public static interface BuildStep {

    BuildStep setSalary(double salary);

    Student build();
}

private static class Steps implements IdFiled, NameFiled, MajorFiled, MobileNumber, BuildStep {

    private int id;

    private String name;

    private String major;

    private String mobileNumber;

    private double salary;


    @Override
    public NameFiled setId(int id) {
        this.id = id;
        return this;
    }

    @Override
    public MajorFiled setNmae(String name) {
        this.name = name;
        return this;
    }

    @Override
    public MobileNumber setMajor(String major) {
        this.major = major;
        return this;
    }

    @Override
    public BuildStep setSalary(double salary) {
        this.salary = salary;
        return this;
    }

    @Override
    public BuildStep setMobile(String mobile) {
        this.mobileNumber = mobile;
        return this;
    }

    @Override
    public Student build() {
        if (id == 0) {
            throw new NullPointerException("ID Can't be 0");
        }
        if (name == null) {
            throw new NullPointerException("Name can't be null");
        }


        if (major == null) {
            throw new NullPointerException("Major can't be null");
        }

        if (mobileNumber == null) {
            throw new NullPointerException("Mbile Number can't be null");
        }

        Student student = new Student(id, name, major, mobileNumber);
        student.setSalary(salary);

        return student;
    }


}

}

Результат шаблона проектирования Step Builder весь код в репозитории GitHub: ссылка

Это первая статья для меня. Я желаю вам счастья, когда вы это прочтете.

Шаблон проектирования Advanced Builder — Java – Карим Радвам – Средний

Карим Радвам ・ 28 февраля 2020 г. ・ 4 минуты чтения Средний

Оригинал: “https://dev.to/kareemradwan/advance-builder-design-pattern-java-3pab”