본문 바로가기

Design Patterns/영문 위키(Wikipedia)

Builder Pattern(빌더 패턴)

먼저 이 글은 영문 위키의 글을 번역한 것을 알려드립니다.

영어 실력이 부족해 오역이 있을 수도 있습니다.

원문 주소 : http://en.wikipedia.org/wiki/Builder_pattern



생성 패턴 - 빌더 패턴



The Builder Pattern(이하 빌더 패턴)은 객체 생성 소프트웨어 디자인 패턴이다. 이 패턴의 의도는 객체의 생성의 단계(steps)들을 추상화해서, 이런 생성 단계의 구현이 달라지면 객체의 다른 표현이 나오도록 하는 것이다. 종종 빌더 패턴은 composite 패턴에 따라 제품을 생성하기 위해 사용된다. 


정의 Definition

빌더 디자인 패턴의 의도는 복잡한 객체의 생성을 표현으로부터 분리시키는 것이다. 이렇게 함으로써 같은 생성 과정(process)에서 다른 표현을 만들어 낼 수 있다.


구조 Structure


Builder - 객체(제품)를 생성하는 추상 인터페이스

Concrete Builder - Builder의 구현 클래스. 다른 객체를 생성할 수 있도록 하는 구체적인 클래스. 객체를 만들기 위해 부분(부품)을 생성하고 조립한다.

Director - Director클래스는 객체 생성의 정확한 순서(sequenct)를 다루는 부분에 책임이 있다. 이 클래스는 ConcreteBuilder를 인자로 받아서 필요한 동작을 수행한다.

Product - Builder를 이용해서 Director가 만들어낸 최종 객체


유용한 팁 Useful tips

  • 빌더는 복잡한 객체를 한단계 한단계씩 생성하는데에 초점을 맞춘다. 추상 팩토리는 제품 객체들의 집단(군)을 강조한다.(생성되는 객체가 단일 객체이던지, 복잡한 객체이던지는 상관없다.) 빌더는 제품을 마지막 단계에 반환하지만, 추상 팩토리가 하는 것처럼 제품을 곧바로 얻어낸다.
  • 빌더는 주로 복잡한 객체(Composite)를 생성한다.
  • 종종, 설계는 팩토리 메서드를 사용해서 시작하지만 설계자가 어느 부분에 있어서 더 많은 유연성이 필요하냐를 발견함에 따라 추상 팩토리, 프로토타입 또는 빌더 등으로 발전하게 된다.
  • 가끔 생성 패턴은 상호 보완적이다. : 빌더는 어떤 컴포넌트가 만들어지는지 정하기 위해 다른 패턴들 중 하나를 사용할 수 있다. 추상 팩토리, 빌더, 프로토타입은 싱글톤을 구현에 사용할 수 있다.
  • 빌더는 fluent interface의 좋은 지원자이다.

예 Examples

Java

/** "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 Waiter {
    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 customer ordering a pizza. */
 class BuilderExample {
    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
        PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
 
        waiter.setPizzaBuilder( hawaiian_pizzabuilder );
        waiter.constructPizza();
 
        Pizza pizza = waiter.getPizza();
    }
 }