고급 빌더 디자인 패턴 — Java

소개:



각 디자인 패턴은 잘 알려진 문제를 해결하기 위해 제공됩니다.
Builder Design Patter 문제는 다음과 같습니다.
빌더 내부에 변수가 많은 클래스가 있습니다. Student 클래스가 있고 다른 유형의 변수 10개를 포함하는 생성자가 있다고 가정합니다. 팀원 중 한 명이 클래스의 개체를 만들고자 할 때 많은 변수로 인해 어려움에 직면하게 됩니다.

그래서 변수를 포함하지 않고 다른 setter를 사용하여 생성자에 필요한 매개 변수를 채우는 메서드를 제공하여 이 문제를 해결하기 위해 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 Design Patter를 적용하려면 데이터 변수를 수집할 새 클래스가 필요하고 사용자가 모든 매개변수 데이터를 채운 후 학생 클래스에서 객체를 생성하므로 'SimpleStudentBuilder' 클래스를 선언해야 합니다.

메모 :


  • Student Constructor를 private로 변경해야 하고 내부 클래스로 변경해야 하므로 이 클래스 'SimpleStudentBuilder'를 Student 클래스 내부에 선언해야 합니다. 새 개체를 Student로 초기화할 수 있습니다.
  • 우리는 또한 'SimpleStudentBuilder' Static을 선언해야 합니다. 학생의 객체 초기화가 아닌 외부 클래스에서 사용할 수 있기 때문입니다 :)

  • SimpleStudentBuilder 클래스:



    //이 클래스는 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 리포지토리에서 전체 코드를 표시할 수 있습니다.

    사용법 SimpleStudentBuilder :



    공개 정적 무효 메인(문자열[] 인수) {
    Student student = new Student.SimpleStudentBuilder()
            .setMajor("IT")
            .setName("Kareem Radwa")
            .setMobileNumber("0597190510")
            .setSalary(1000)
            .setId(32)
            .build();
    
    }

    딥 인 빌더 디자인 패턴 :)



    Student Constructor에서 예를 들어 [ id, name, major, mobile number ] 순서로 매개 변수 값을 전달하는 데 우선 순위가 있다고 가정합니다. 이 배열이 사라지면 Class Student에서 개체를 만들 수 없습니다.

    그래서 우리는 이 상황에 대한 답이 필요합니다. 답은 Step Builder이지만 이 답을 어떻게 구현할 수 있습니까? 계속 읽으세요 :)

    스텝 빌더 디자인 패턴:



    이 아이디어를 적용하려면 다음이 필요합니다.

    동일한 수의 Require 변수가 있는 많은 인터페이스가 있으므로 우리의 학생 클래스 예제에서는 4개의 인터페이스가 필요하고 추가로 Build Method 및 선택적 변수에 대한 인터페이스가 하나 더 필요합니다.
    클래스는 위의 모든 인터페이스를 구현합니다. 이 '단계'에는 캡션이 필요합니다.

    사용법 StudentStepBuilder에 대한 설명:



    빌더의 이 접근 방식을 사용해야 하는 경우 처음에만 ID 설정 방법을 표시해야 하며 사용자가 이를 입력하면 그 후에 이름 변수 값 등을 설정할 수 있습니다.

    코딩 시간:



    공개 클래스 StudentStepBuilder {
    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;
        }
    
    
    }
    
    }

    사용법 StudentStepBuilder:



    스텝 빌더 디자인 패턴의 결과
    GitHub 리포지토리의 모든 코드: link

    드디어



    이것은 나를위한 첫 번째 기사입니다. 당신이 그것을 읽을 때 나는 행복을 기원합니다.

    중간:




    좋은 웹페이지 즐겨찾기