참조: Effective Java 2nd Edition. Item 2: Consider a builder when faced with many constructor parameters

생성자나 static factory method에 매개 변수가 너무 많고 다양할 때 기존에는 Telescoping constructor 패턴 또는 JavaBeans 패턴을 사용왔다.

telescoping constructor 패턴
- 생성자에서 다른 생성자 호출하면서 비는 매개변수에는 기본값 설정해주는 방식.
- 잘 동작은 하는데, 매개 변수를 많이 사용할 떄는 클라이언트 코드를 작성하기도 힘들고, 읽기도 힘들다.
- 위치가 바껴도 컴파일 에러가 안 남.
 
JavaBeans 패턴
- 기본 생성자만 사용하고, 필요한 속성은 세터 사용.
- 쉽게 객체 생성 가능. 코드 읽기 쉬움.
- 생성 과정이 여러 호출로 구성되어 있어서 불완전한 상태로 사용될 여지가 있다.
- 불변 객체로 만드는 걸 불가능하게 하고, 쓰레드 세이프티를 보장하려면 개발자가 추가로 신경을 써야 한다. -> freezing 이용할 수 있지만 이 방법은 거의 사용 안 해.

Builder 패턴
- 필요한 객체를 직접 만들지 않고, 필수 매개 변수를 생성자나 static factory 메소드에 넘겨서 객체를 만들고, 부가적인 속성들은 그 뒤에 설정한다. 그리고 최종적으로 build()를 호출해서 불변 객체를 생성한다.
- 클라이언트 코드
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).sodium(35).carbohydrate(27).build();
- 작성하기도 쉽고, 읽기도 쉽다. Ada와 Python의 named optional parameters를 사용했다.
- Abstract Factory 패턴을 구현할 때, 자바 1.5 이상의 버전에서 빌더를 사용하면, 예전처럼 런타임이 아닌 컴파일 타임에 에러를 발견할 수 있다.
- 단점: 빌더 객체 생성 비용. 다른 패턴에 비해서 좀 복잡하다. 따라서 매개 변수가 넷 이상일 때만 사용을 권장.