ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 빌더(Builder) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:30

    Pattern #5  빌더 패턴




     복잡한 객체의 생성 루틴을 객체의 표현과 분리하기 위한 패턴




     목적

      - 객체의 construction 과정과 객체의 representation을 분리.

      - 이렇게 분리함으로써 하나의 construction 과정을 이용하여 서로 다른 형태의 representation을 생성할 수 있음.


     




     동기

      

      RTF(Rich Text Format) 문서 파일을 읽어서 다른 형태(MS--Word, HWP, ASCII,...) 의 문서로 변환하는 프로그램을 개발하여야 한다. 어떻게 설계하는 것이 좋을까???

      

     



     










    RTF Reader는 세부 파일포맷을 위한 Builder를 직접 접근하지 않는다.


     










    RTF 파일을 읽어 분석하는 ParseRTF() 내에서는 builder가 어떤 객체인지와는 상관없이 변환 작업을 수행


    각 빌더들(ASCIIBuilder, MSWordBuilder,...)는 고유의 파일 포맷에 맞추어 Text 객체를 생성하고 구축한다.


    빌더는 reader와 분리된

     - RTF Reader는 RTF 문서를 파싱하는 일에 책임

     - 각 빌더는 텍스트 파일을 생성하고 조합하는 일에 책임










    예제를 통해 알아보자.





    Starbucks.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    package builder;
     
    public class Starbucks {
        private String size;
        private String drink;
     
        public void setSize(String size) {
            this.size = size;
        }
     
        public void setDrink(String drink) {
            this.drink = drink;
        }
    }
     
    cs



    StarbucksBuilder.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    package builder;
     
    public abstract class StarbucksBuilder {
        protected Starbucks starbucks;
     
        public Starbucks getStarbucks() {
            return starbucks;
        }
     
        public void createStarbucks() {
            starbucks = new Starbucks();
            System.out.println("A drink is created");
        }
     
        public abstract void buildSize();
     
        public abstract void buildDrink();
    }
     
    cs



    TeaBuilder.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    package builder;
     
    public class TeaBuilder extends StarbucksBuilder {
     
        public void buildSize() {
            starbucks.setSize("Large");
            System.out.println("Build large size");
        }
     
        public void buildDrink() {
            starbucks.setDrink("Tea");
            System.out.println("Build tea");
        }
    }
     
    cs



    CoffeeBuilder.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    package builder;
     
    public class CoffeeBuilder extends StarbucksBuilder {
     
        public void buildSize() {
            starbucks.setSize("Medium");
            System.out.println("Build medium size");
        }
     
        public void buildDrink() {
            starbucks.setDrink("Coffee");
            System.out.println("Build coffee");
        }
    }
     
    cs



    Waiter.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    package builder;
     
    public class Waiter {
        private StarbucksBuilder starbucksBuilder;
     
        public void setStarbucksBuilder(StarbucksBuilder builder) {
            starbucksBuilder = builder;
        }
     
        public Starbucks getstarbucksDrink() {
            return starbucksBuilder.getStarbucks();
        }
     
        public void constructStarbucks() {
            starbucksBuilder.createStarbucks();
            starbucksBuilder.buildDrink();
            starbucksBuilder.buildSize();
        }
    }
     
    cs



    Customer.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    package builder;
     
    public class Customer {
        public static void main(String[] args) {
            Waiter waiter = new Waiter();
            StarbucksBuilder coffeeBuilder = new CoffeeBuilder();
     
            waiter.setStarbucksBuilder(coffeeBuilder);
            waiter.constructStarbucks();
     
            Starbucks drink = waiter.getstarbucksDrink();
        }
    }
     
    cs
















    댓글

Designed by Tistory.