빌더패턴은 보통 객체를 생성하면서 많이 사용하게 되는 패턴이다.
빌더패턴은 왜 필요한걸까?
People 클래스가 존재하는데 이 클래스의 구성은 다음과 같다.
public class People {
private String name;
private int age;
private String phoneNumber;
private String sex;
private String address;
//getter, setter 생략
public static PeopleBuilder builder() {
return new PeopleBuilder();
}
}
(위 클래스에서 setter랑 getter는 존재하지만 생략했다.)
객체를 생성하려고 할 때 접근 제어자로 인해 우리는 객체를 생성하고 값을 입력하기 위해서는 Setter를 거쳐야 한다. 그렇기 때문에 객체를 생성할 때 멤버변수를 초기화 할 수 있는 생성자를 이용한다.
지금 Person 클래스는 멤버변수가 8개 밖에 없기 때문에, 반드시 필요로하는 멤버변수들을 오버로딩한 생성자를 여러 개 만들 때 큰 어려움이 없지만 다음과 같이 3개를 만드는 것도 힘들다.
public People() {}
public People(String name, int age, String phoneNumber) {
this.name = name;
this.age = age;
this.phoneNumber = phoneNumber;
}
public People(String name, int age, String sex, String address) {
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
}
멤버변수가 지금보다 조금만 더 늘어난다고 한다면 객체 생성을 위해 만들어야 하는 생성자의 개수는 어마어마할 것이다. 이러한 불편을 해결하기 위해서 사용하는 것이 바로 빌더패턴이다.
위와 같이 생성자를 통해서 객체를 생성했을 때와는 달리,
People people = People.builder()
.name("jun")
.Age(20)
.build();
생성자를 오버로딩하지 않아도 이러한 방식의 객체 생성이 가능해진 것이다.
public class PeopleBuilder {
private String name;
private int age;
private String phoneNumber;
private String sex;
private String address;
public PeopleBuilder name(String name) {
this.name = name;
return this;
}
public PeopleBuilder Age(int age) {
this.age = age;
return this;
}
public PeopleBuilder PhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
return this;
}
public PeopleBuilder Sex(String sex) {
this.sex = sex;
return this;
}
public PeopleBuilder Address(String address) {
this.address = address;
return this;
}
public People build() {
People people = new People();
people.setName(name);
people.setAge(age);
people.setPhoneNumber(phoneNumber);
people.setSex(sex);
people.setAddress(address);
return people;
}
}