Free Lines Arrow
본문 바로가기
Design pattern/GoF(인강편)

[Design Pattern] Builder Pattern

by skahn1215 2021. 11. 24.
728x90
반응형

Builder Pattern

  • 프로퍼티 즉 변수가 많을 경우 명확하게 값을 넣어 생성하게 해준다.
  • 왜 써야 할까? 만약 변수가 100개 200개 정도 된다면 실수없이 데이터를 넣을수 있을까?
  • 빌더 패턴을 쓰면 명확하게 값을 넣을수 있고 값이 없는 경우 default 값을 줄수도 있겠다.
  • 하지만 비용이 들기 때문에 변수가 최소 4개 이상일때 효과적이다.

 

Builder Pattern 예제

  • 학생 클래스가 있다고 해보자 만약 변수가 100개 정도 된다면?
  • 생성자에 값을 직접 넣거나 setter로 넣으면 복잡해지고 보기도 어렵다.

 

Student Class

package patterns.builder;

public class Student {
    private String name;
    private int age;
    private int grade;

    public Student(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "name:" + name + " age:" + age + " grade:" + grade;
    }
}

 

StudentBuilder Class

이처럼 빌더를 따로 만들어서 명확하게 값을 넣어줄수 있다.

package patterns.builder;

public class StudentBuilder {
    private Student student;

    private StudentBuilder() {
        student = new Student("",0,0);
    }

    public static StudentBuilder start() {
        return new StudentBuilder();
    }

    public StudentBuilder setName(String name) {
        student.setName(name);
        return this;
    }

    public StudentBuilder setAge(int age) {
        student.setAge(age);
        return this;
    }

    public StudentBuilder setGrade(int grade) {
        student.setGrade(grade);
        return this;
    }

    public Student build() {
        return student;
    }

}

 

 

Main Class

  • 빌더 적용전:
     - 지금은 변수가 몇개 없어서 쉽지만 벌써 22 가 무슨 값인지 1 이 무슨 값인지 알아보기 힘들다.
  • 빌더 적용후:
     - 명확해 졌다.
package patterns.builder;

public class Main {
    public static void main(String[] args) {
        // 빌더 적용전
        Student student1 = new Student("name", 22,1);

        // 빌더 적용후
        Student student2;
        student2 = StudentBuilder.start()
                                .setName("student1")
                                .setAge(12)
                                .setGrade(1)
                                .build();

        System.out.println(student2.toString());
    }
}

 

 

 

728x90
반응형

댓글