디자인패턴
[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;
}
}