디자인패턴

[Design Pattern] 빌더 패턴

쉽코기 2021. 12. 19. 17:31

1. 빌더패턴 란?

  • 빌더 패턴은 객체 생성과정을 그 개체의 클래스로부터 분리시키는 하나의 방법이다.
  • 객체의 부분부분을 만들어 나가다가 준비되면 객체를 생성해나가는 방식이다.

 

2. 빌더 패턴의 장점(= 생성자의 문제 해결)

  • 생성자가 여러개의 인자를 받을 때 그 순서의 오류는 막지 못한다.(type이 같다면 막을 수 가 없음)
  • 필요 없는 인자에 대해서 null 값을 넘겨 주거나 여러개의 생성자를 만들어야한다.
  • 유지보수에 유리하다
    • 기존의 코드에 생성자 인자 값을 추가해야할때 기존의 코드를 고치지 않고 builder 에 메서드를 추가하여 제작할 수 있다.(Open - Close 원칙 준수)

 

 

2-1. 빌더 패턴의 단점 

빌더패턴으로 인핸 생성에 있어 자유도가 생겼습니다.

실질적으로는 반드시 넣어서 제작해야하는 파라미터임에도 이 부분을 잊고 넣지 않더라도 생성이 가능합니다.

즉 무결성을 해칠 수 있게 되는 것입니다.

예를 들어 아래 예제에서처럼 빌더를 제작하고 emplyee 를 생성한다면 employee의 맴버 변수 startingYear는 0을 갖게되어 의도치 않은 실수를 발생시킬 수 있습니다.

 

 

3. 예제

  • 생성자는 빌더만을 인자로 받는다.
  • 빌더의 함수들은 빌더 자신을 반환하여 플루언트 인터페이스로 제작한다.
//main

 Employee employee = new EmployeeBuilder(11)
                .setAge(10)
                .setLastName("kim")
                .setFirstName("john")
                .build();

System.out.println(employee.getFirstName()); // john

 

//Emplyee
public class Employee {
    int id;
    int age;
    int startingYear;
    String firstName;
    String lastName;

    public Employee(EmployeeBuilder employeeBuilder) {
        this.id = employeeBuilder.id;
        this.age = employeeBuilder.age;
        this.startingYear = employeeBuilder.startingYear;
        this.firstName = employeeBuilder.firstName;
        this.lastName = employeeBuilder.lastName;
    }

}
//EmplyeeBuilder

public class EmployeeBuilder {

    int id;
    int age;
    int startingYear;
    String firstName;
    String lastName;


    public EmployeeBuilder(int id) {
        this.id = id;
    }

    public Employee build() {
        return new Employee(this);
    }

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

    public EmployeeBuilder setStartingYear(int startingYear) {
        this.startingYear = startingYear;
        return this;
    }

    public EmployeeBuilder setFirstName(String firstName) {
        this.firstName = firstName;
        return this;
    }

    public EmployeeBuilder setLastName(String lastName) {
        this.lastName = lastName;
        return this;
    }
}