ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생성패턴 : Builder 패턴
    디자인패턴 2012. 12. 28. 09:30
    반응형

    분류 : 생성패턴(Creational Patterns)


    정의 :

    복잡한 객체의 생성을 표현과 분리함으로써 같은 생성절차를 가지면서 다른 표현들을 만들수 있게 함.


    용도 :

    • Builder 패턴은 복잡한 객체를 단계적으로 생성하는 것에 초점을 둠.
    • Builder 패턴은 종종 Composite 패턴을 만듬.



    구조 :



    Builder : 객체를 생성하기위한 추상 인터페이스

    Concrete Builder : Builder에 대한 구현을 제공. 다른 객체들을 생성할수 있는 객체임.



    코드 :

    /** Product */
    public 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; }
    	
        public String getDough(){ return dough; }
        public String getSauce(){ return sauce; }
        public String getTopping(){ return topping; }
    }
    
    /** Abstract Builder */
    public 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 */
    public class HawaiianPizzaBuilder extends PizzaBuilder{
        public void buildDough()   { pizza.setDough("cross"); }
        public void buildSauce()   { pizza.setSauce("mild"); }
        public void buildTopping() { pizza.setTopping("ham+pineapple"); }
    }
    
    /** ConcreteBuilder */
    public 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 */
    public 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();
    	}
    }
    
    public class BuilderExample {
    
    	/**
    	 * A customer ordering a pizza
    	 */
    	public static void main(String[] args) {
    		Waiter waiter = new Waiter();
            PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
            PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();
     
            //이 부분에서 hawaiianPizzaBuilder, spicyPizzaBuilder를 번갈아서 입력하면서 출력되는 내용을 확인해 보면 됨.
            waiter.setPizzaBuilder( spicyPizzaBuilder );
            waiter.constructPizza();
     
            Pizza pizza = waiter.getPizza();
            
            System.out.println(pizza.getDough());
            System.out.println(pizza.getSauce());
            System.out.println(pizza.getTopping());
    	}
    
    }
    




    참고자료

    GoF의 디자인패턴, 피어슨에듀케이션코리아, 2002

    http://en.wikipedia.org/wiki/Builder_pattern

    반응형

    '디자인패턴' 카테고리의 다른 글

    생성패턴 : Singleton 패턴  (0) 2013.01.16
    생성패턴 : Prototype 패턴  (0) 2013.01.15
    생성패턴 : Factory Method 패턴  (0) 2013.01.10
    생성패턴 : Abstract Factory 패턴  (0) 2012.12.18
    디자인패턴  (0) 2012.11.13

    댓글

Designed by Tistory.