[JAVA/디자인패턴] Builder Pattern, 빌더 패턴

2024. 1. 29. 03:53
반응형

 

Builder Pattern

 

 

 

Builder 패턴은 객체 생성 과정을 분리하여 복잡한 객체를 단순화하는 디자인 패턴이다.

이 패턴은 객체의 생성과 표현을 분리하여, 서로 다른 방식으로 객체를 만들 수 있게 한다. 특히 매개변수가 많고 다양한 조합이 가능한 경우에 효과적이다.

 

Product : Builder 패턴을 통해 생성되는 복잡한 객체

Builder : 객체를 생성하기 위한 메서드를 정의하는 인터페이스

Concrete Builder : Builder 인터페이스를 구현하여 실제로 객체를 생성하는 클래스

Director : Builder 패턴을 사용하는 클라이언트 

 

 

 


Builder 패턴 예시

 

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;

        // Optional parameters 
        private int fat = 0;
        private int sodium = 0;
        private int carbohydrate = 0;
        private int calories = 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;
        }
        
        //빌더 패턴을 통해 완성된 Product 클래스를 생성하여 반환한다.
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }
    
    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }

    public String toString(){
        return String.format("Calories %s / Carbohydrate %s / Fat %s / Servings %s / ServingSize %s / Sodium %s",
                this.calories, this.carbohydrate, this.fat, this.servings, this.servingSize, this.sodium);
    }

}

 

 

NutritionFacts (Product)

  • Immutable 클래스로서, 한 번 생성되면 내부의 속성값들을 변경할 수 없다.
  • 여러개의 속성을 가지며, Builder를 통해 조합이 이루어 질 수 있다.
  • 생성자는 Builder 클래스를 통해 호출되며, Builder 클래스가 제공하는 값으로 객체를 초기화한다.

Builder 

  • NutritionFacts 객체를 생성하기 위한 빌더 역할을 한다. build 메서드를 통해 실제 NutritionFacts 객체를 생성한다.
  • 필수적으로 필요한 속성을 인자로 받는 생성자가 있다.
  • 나머지 속성들은 선택적으로 설정할 수 있으며, 이를 설정하기 위한 빌더 메서드들을 제공한다. 각 메서드들은 빌더 자신을 반환하므로 메서드 체이닝을 통해 여러 속성을 동시에 설정할 수 있다.

 

 

 

public class Main {
    public static void main(String[] args){
        NutritionFacts cocaCola
                = new NutritionFacts.Builder(240, 8)
                .calories(100) 
                .sodium(35) 
                .carbohydrate(27) 
                .build();

        System.out.println(cocaCola.toString());
    }
}

 

Director

  • Builder 패턴을 사용하여 NutritionFacts 객체를 생성하는 클라이언트 코드이다.
  • 메서드 체이닝 방식을 사용하여 객체의 속성들을 설정하고, build() 메서드를 통해 실제 인스턴스를 반환받는다.

 

 

 

 

 

반응형

BELATED ARTICLES

more