본문 바로가기

Java/디자인 패턴의 활용

빌더 패턴이란?

빌더 패턴이란?

빌더 패턴은 복잡한 객체를 단계적으로 생성할 수 있도록 도와주는 디자인 패턴이다. 특히 많은 옵션이나 매개변수를 가진 객체를 만들 때 유용하다. 일반적인 생성자는 매개변수가 많아지면 복잡해지기 때문에, 빌더 패턴은 각 단계에서 선택적인 매개변수를 추가할 수 있게 해준다.

 

햄버거 예제와 빌더 패턴

햄버거를 주문할 때, 특정 업체에서는 다양한 재료 중에서 자신만의 햄버거를 만들 수 있다. 먼저 빵과 패티 같은 필수 재료를 선택하고, 그다음으로 치즈, 양상추, 토마토 같은 선택적인 재료를 추가한다. 이 과정은 빌더 패턴과 매우 유사하다.

 

필수 요소와 선택 요소

  • 필수 요소: 햄버거를 만들기 위해선 반드시 있어야 하는 재료가 있다. 예를 들어, 빵과 패티는 꼭 필요한 요소이다. 빌더 패턴에서는 객체를 만들기 위한 필수 요소를 생성자를 통해 전달한다.
  • 선택 요소: 필수 요소 외에도 고객이 추가할 수 있는 여러 선택적인 재료가 있다. 치즈, 토마토, 양상추는 꼭 있어야 하는 건 아니지만, 원할 경우 추가할 수 있다. 빌더 패턴에서는 이런 선택적인 요소들을 메서드로 추가할 수 있다.

 

package builder;

// 햄버거 클래스 : 빌더 패턴을 사용해 단계적으로 객체를 생성
public class Burger {

    // 필수요소와 선택적 요소가 있을 수 있다.
    private String bread;
    private String patty;
    private boolean cheese;
    private boolean tomato;
    private boolean lettuce;

    // 외부에서 직접 생성하지 못하도록 private 생성자 선언
    // 내부 정적 클래스에서 생성된 상태값들을 받아 멤버 변수를 초기화 한다.
    private Burger(BurgerBuilder builder){
        this.bread = builder.bread;
        this.patty = builder.patty;
        this.cheese = builder.cheese;
        this.tomato = builder.tomato;
        this.lettuce = builder.lettuce;
    }

    // 반드시 정적 내부 클래스를 선언한다.
    public static class BurgerBuilder{

        private String bread;
        private String patty;
        private boolean cheese = false;
        private boolean tomato = false;
        private boolean lettuce = false;

        // 필수 매개변수를 받을 생성자를 설계한다.
        public BurgerBuilder(String bread, String patty){
            this.bread = bread;
            this.patty = patty;
        }

        // 선택적 요소를 단계적으로 추가할 수 있도록 메서드를 설계해준다.
        public BurgerBuilder addCheese(){
            this.cheese = true;
            return this; // 메서드 체이닝 지원
        }

        public BurgerBuilder addTomato(){
            this.tomato = true;
            return this; // 메서드 체이닝 지원
        }

        public BurgerBuilder addLettuce(){
            this.lettuce = true;
            return this; // 메서드 체이닝 지원
        }

        // 핵심1 - 최종적으로 Burger 객체를 반환하는 메서드를 생성(만들어준다.)
        public Burger build(){
            return new Burger(this);
        }

    }// end of inner class

    // alt + shift + s 로 생성
    @Override
    public String toString() {
        return "Burger [bread=" + bread + ", patty=" + patty + ", cheese=" + cheese + ", tomato=" + tomato
                + ", lettuce=" + lettuce + "]";
    }

}// end of class
package builder;

public class BurgerStore {

    public static void main(String[] args) {

        Burger burger1 = new Burger.BurgerBuilder("부드러운빵", "소고기")
                        .addCheese()
                        .addTomato()
                        .build();
        
        System.out.println(burger1);
        System.out.println("----------------------------");

        Burger 치즈와양상추버거 = new Burger.BurgerBuilder("빵", "닭고기")
                        .addLettuce()
                        .addTomato()
                        .build();

        System.out.println(치즈와양상추버거);
    
    }

}

 

 

요약

즉 빌더 패턴은 복잡한 객체를 단계적으로 생성할 수 있도록 도와주는 디자인 패턴이다.

728x90

'Java > 디자인 패턴의 활용' 카테고리의 다른 글

어댑터 패턴  (1) 2024.09.26
팩토리 패턴  (2) 2024.09.26
싱글 톤 패턴  (1) 2024.09.25
콜백 메서드 만들어보기  (0) 2024.09.25
디자인 패턴의 활용  (2) 2024.09.25