빌더 패턴이란, 객체의 생성과정과 표현방법을 분리해서 다양하게 이루어진 인스턴스를 만드는 생성패턴
매개 변수로 값을 하나하나 받아서 진행하고 마지막으로 통합 빌드 해서 객체를 생성
수제 햄버거로 예시를 들자, 수제 햄버거 이기에 사용자가 원하는 순서나 먹고 싶지않은 재료들이 있을 것이다. 이처럼 선택적으로 속성들을 우연하게 받아서 인스턴스를 생성할 수 있게 하는 것이 빌더 패턴이다.
Java Beans 패턴 : 빈 객체를 만들고 setter를 사용해서 인스턴스 생성
- 개발자의 실수로 인한 문제점 발생 가능성이 높음
- setter를 빼먹음
- 불변성 문제
- setter를 노출하게되면 협업과정에서 누군가 setter 메서드를 사용해서 객체를 조작할 수 있게되고 이는 추후에 큰 문제를 일으킨다.
생성하고자 하는 객체의 Builder 클래스를 만들고 이 클래스는 하나의 메서드당 하나의 속성을 지정해주고 원하는 속성 값 배정이 끝난 후에 객체를 생성
class Student {
private int id;
private String name = "아무개";
private String grade = "freshman";
private String phoneNumber = "010-0000-0000";
public Student(int id, String name, String grade, String phoneNumber) {
this.id = id;
this.name = name;
this.grade = grade;
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "Student { " +
"id='" + id + '\'' +
", name=" + name +
", grade=" + grade +
", phoneNumber=" + phoneNumber +
" }";
}
}
class StudentBuilder {
private int id;
private String name;
private String grade;
private String phoneNumber;
public StudentBuilder id(int id) {
this.id = id;
return this;
}
public StudentBuilder name(String name) {
this.name = name;
return this;
}
public StudentBuilder grade(String grade) {
this.grade = grade;
return this;
}
public StudentBuilder phoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
return this;
}
public Student build() {
return new Student(id, name, grade, phoneNumber); // Student 생성자 호출
}
}
중요하게 봐야할 점은 각각의 메서드마다 return this 를 통해서 자신의 객체를 호출하게되고 이를 통해서 체이닝 기술이 사용할 수 있게된다.
마지막에 객체를 생성할때에는 build()라는 메서드를 실행시켜서 원하느 인스턴스를 반환한다.
public static void main(String[] args) {
Student student = new StudentBuilder()
.id(2016120091)
.name("임꺽정")
.grade("Senior")
.phoneNumber("010-5555-5555")
.build();
System.out.println(student);
}
new StudentBuilder(2016120091) // 필수 멤버
.name("홍길동") // 선택 멤버
.build();
```