많은 프로그래머들은 생성자 매개변수가 많을 때 적절하게 대응하기 위해 점층적 생성자 패턴을 주로 사용했었습니다.
ex) 점층적 생성자 패턴 예시
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohyudrate;
public NutritionFacts(int servingSize, int servings) {
this(servingSize, servings, 0);
}
public NutritionFacts(int servingSize, int servings, int calories) {
this(servingSize, servings, calories, 0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat) {
this(servingSize, servings,calories,fat,0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
this(servingSize, servings,calories, fat,sodium,0);
}
public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohyudrate) {
this.servingSize = servingSize;
this.servings = servings;
this.calories = calories;
this.fat = fat;
this.sodium = sodium;
this.carbohyudrate = carbohyudrate;
}
}
위 점층적 생성자 패턴은 매개변수의 개수가 많아지면 많아질 수록 클라이언트측 코드가 모호해지고
가독성이 떨어지는 문제가 있습니다.
(각 번째수 매개변수가 무엇을 의미하는지 정확하게 알고 사용해야함, 그렇기에 사용하기 까다로움)
위 점층적 생성자 패턴의 단점을 보완하고자 자바 빈즈 패턴이라는 것을 고려할 수 있는데
ex) 자바 빈즈 패턴
NutritionFacts nutritionFacts = new NutritionFacts();
nutritionFacts.setFat(0);
nutritionFacts.setCalories(0);
nutritionFacts.setServingSize(0);
자바 빈즈 패턴을 사용함으로써 인스턴스를 생성하기 좀 더 쉬워졌고, 가독성이 좋아지긴 했으나,
완전한 인스턴스 생성을 위해 여러개의 메소드를 거쳐야만 했고(불변성을 유지할 수 없음), 인스턴스가 완전히 생성되기 전까지는 일관성이 무너진 상태로 존재해야하는 단점을 갖고 있습니다.
이러한 점층적 생성자 패턴과 자바 빈즈 패턴의 단점을 보완하고자 빌더(Builder) 패턴이라는 것을 사용할 수 있습니다.
NutritionFacts nutritionFacts = NutritionFacts.builder()
.carbohyudrate(1)
.fat(2)
.calories(3)
.servings(2)
.build();
빌더 패턴을 통해 클라이언트 코드의 가독성이 좋아지고, 자바 빈즈 패턴보다 훨씬 안전하게 인스턴스를 생성할 수 있습니다.