생성자가 만약 20개가 넘고, 생성할 때 몇몇 필드는 의미가 없는 값이라면 어떨까.
public class User(){
private String name;
private int number;
private bool type;
private int stock;
private String mail;
....
public User(){}
public User(String name){}
public User(String name, int number){}
..
}
위의 코드는 점층적 생성자 패턴을 이용했다. 매개변수를 1개 받는 경우부터 시작해서 모두 다 받는 생성자까지 전부 작성하는 것이다. 단순하지만, 작성하기도 불편할 뿐 더러 객체를 만들 때도 난처하다. 내가 매개변수를 제대로, 순서에 맞춰서 기입했는지 개수를 세는 건 매우 비효율적인 것 같다.
자바빈즈(java beans) 패턴을 사용해 개선을 시도했다. 빈 생성자만 만들고, set메서드를 제공해 알아서 set을 통해 매개변수들을 설정한다. 그리고 필드들은 특정 값으로 미리 초기화를 해두는 것이다.
이 방법의 단점은 객체를 하나 만들 때 여러 메서드를 호출해야 한다는 점, 객체가 완성되기 전까지는 일관성이 무너진다는 점이 있다.
이런 단점들을 보완하는 것이 빌더 패턴이다. 필수 매개변수만으로 생성자를 호출해서 빌더 객체를 얻고, 이 객체가 제공하는 setter를 통해 선택적으로 매개변수들을 설정한다.
public class User(){
private Long id;
private String name;
private String user_id;
private int number;
public static class Builder(){
//필수
private Long id;
private String name;
private String user_id;
//선택
private int number = 0;
public Builder(Long id, String name, String user_id){
this.id = id;
this.name = name;
this.user_id = user_id;
}
public Builder Number(int val){
number = val;
return this;
}
public User build(){
return new User(this);
}
}
private User(Builder builder){
id = builder.id;
name = builder.name;
user_id = builder.user_id;
number = builder.number;
}
}
파이썬과 스칼라에 존재하는 named optional parameters(명명된 선택적 매개변수)를 흉내 낸 것이다.