빌더 패턴

1 개요[ | ]

builder pattern
빌더 패턴
  • 복잡한 인스턴스를 조립하여 만드는 구조
  • 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴
  • 객체를 만드는 과정이 복잡한 경우에 적용하자.
  • 간단히 교체가능한 알고리즘을 기반으로 객체 생성을 동적으로 할 수 있게 해준다.
  • 빌더 인터페이스 자체에 변경이 있으면, 모든 구체 빌더에 영향이 있을 수 있다.
  • 빌더 패턴은 컴포지트 객체 생성에 특화된 전략 패턴이라고 볼 수 있다.
  • 필요시 생성자를 private로 직접 생성할 수 없게 하여, 빌더 사용을 강제할 수 있다.

2 구조[ | ]

Builder UML class diagram.svg

W3sDesign Builder Design Pattern UML.jpg

3 예제[ | ]

/** "Product" */
class Pizza {
        private String dough = "";
        private String sauce = "";
        private String topping = "";
 
        public void setDough(String dough) {
                this.dough = dough;
        }
 
        public void setSauce(String sauce) {
                this.sauce = sauce;
        }
 
        public void setTopping(String topping) {
                this.topping = topping;
        }
}
 
/** "Abstract Builder" */
abstract class PizzaBuilder {
        protected Pizza pizza;
 
        public Pizza getPizza() {
                return pizza;
        }
 
        public void createNewPizzaProduct() {
                pizza = new Pizza();
        }
 
        public abstract void buildDough();
 
        public abstract void buildSauce();
 
        public abstract void buildTopping();
}
 
/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
        public void buildDough() {
                pizza.setDough("cross");
        }
 
        public void buildSauce() {
                pizza.setSauce("mild");
        }
 
        public void buildTopping() {
                pizza.setTopping("ham+pineapple");
        }
}
 
/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder {
        public void buildDough() {
                pizza.setDough("pan baked");
        }
 
        public void buildSauce() {
                pizza.setSauce("hot");
        }
 
        public void buildTopping() {
                pizza.setTopping("pepperoni+salami");
        }
}
 
/** "Director" */
class Cook {
        private PizzaBuilder pizzaBuilder;
 
        public void setPizzaBuilder(PizzaBuilder pb) {
                pizzaBuilder = pb;
        }
 
        public Pizza getPizza() {
                return pizzaBuilder.getPizza();
        }
 
        public void constructPizza() {
                pizzaBuilder.createNewPizzaProduct();
                pizzaBuilder.buildDough();
                pizzaBuilder.buildSauce();
                pizzaBuilder.buildTopping();
        }
}
 
/** A given type of pizza being constructed. */
public class BuilderExample {
        public static void main(String[] args) {
                Cook cook = new Cook();
                PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
                PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
 
                cook.setPizzaBuilder(hawaiianPizzaBuilder);
                cook.constructPizza();
 
                Pizza pizza = cook.getPizza();
        }
}

4 같이 보기[ | ]

5 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}