생성자가 만약 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(명명된 선택적 매개변수)를 흉내 낸 것이다.