빌더 패턴
빌더 패턴은 복잡한 객체 생성 과정을 단순화하고 객체의 다양한 속성을 설정하는 방법을 제공하는 디자인 패턴 이다.
이해가 잘 되지 않는다. 바로 예제를 살펴보자
빌더 패턴 예제
콜라 같은 식품의 영양 정보표를 만들어보자. 이 표에는 요구되는 필수 정보와 넣어도 되고 넣지 않아도 되는 선택적 정보를 포함한다.
필수 정보
- 1회 분량(serving size), 총 분량(servings) ...
선택 정보
- 지방(total fat), 포화지방(saturated fat), 트랜스 지방(trans fat), 나트륨(sodium)...
이 때, 선택 정보에 대해 생성자를 여러개 만들어 오버로딩할 수 도 있지만 너무 코드가 길어지고 파라미터의 순서나 개수를 파악하기 힘들어 문제가 생긴다. 이 때, 빌더 패턴을 사용한다. 코드를 살펴보자.
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 carbohydrate;
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int sodium = 0;
private int carbohydrate = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this;
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
public int getCalories(){
return calories;
}
NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
- Builder라는 빌더 클래스를 생성한다. 파라미터로는 필수 정보인 servingSize와 servings를 받는다.
- 선택 정보는 setter의 형태로 메소드를 작성해준다.(set은 붙이지 않아도 된다.) 객체를 생성할 때 포함할지 하지 않을지 선택권을 준다.
- build() 메소드로 객체를 생성하면서 원하는 정보만 가진 객체를 생성할 수 있게 된다.
public class NutritionFactsMain {
public static void main(String[] args) {
NutritionFacts cocaCola = new NutritionFacts.Builder(240,8)
.calories(100)
.sodium(35)
.carbohydrate(27)
.build();
System.out.println(cocaCola.getCalories());
}
}
- 넣고 싶은 선택 정보만 포함해서 객체를 생성함을 볼 수 있다.
정리
- 빌터 패턴은 객체 생성을 직접 하지 않고 필수 요소를 전달한 후 생성자를 호출해서 빌더 객체를 생성한다.
- 빌더 객체에 선택 요소에 대하 setter와 비슷한 메소들을 호출한다.
- build() 메소드를 호출해서 원하는 immutable 객체를 생성한다.
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] Adapter Pattern (0) | 2023.12.09 |
---|---|
[디자인 패턴] 컴포지트 패턴 (Composite Pattern) (0) | 2023.12.09 |
[디자인 패턴 기초] 데코레이터 패턴 (Decorator Pattern) (1) | 2023.10.10 |
[디자인 패턴 기초] 싱글턴 패턴 (Singleton Pattern) (1) | 2023.10.07 |
[디자인 패턴 기초] 옵저버 패턴(observer pattern) (0) | 2023.09.26 |