[Design Pattern] GoF 생성 패턴 - 빌더 패턴(Builder Pattern)



빌더 패턴(Builder Pattern)

GoF 디자인 패턴 중 생성 패턴에 해당한다.
빌더 패턴은 복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법을 제공한다.


사용법

  • 객체의 생성 알고리즘이 조립 방법에 독립적일 때
  • 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 표현 과정을 지원해야할 때


구조

img

  • Builder추상클래스를 정의하고 이를 상속받은 ConcreteBuilder서브클래스를 구현한다.
  • Product의 일부가 build될 때마다 Director는 Builder에 통보한다.
  • Builder는 Director의 요청을 처리해 Product에 부품을 추가한다.


장점

  • 표현을 다양하게 변경할 수 있음
  • 생성과 표현 코드를 분리함
  • 복합 객체를 생성하는 절차를 세밀하게 나눌 수 있음


예제


클래스 다이어그램

img


패키지 구조

img


구현

추상 클래스인 ToyBuilder에서 Director가 요청하는 build 연산을 정의한다. ToyBuilder를 상속받은 ConcreteBuilder(PoohBuilder, ZzangGuBuilder)가 필요한 표현을 override한다. ConcreteBuilder는 Toy의 부품들을 조립하고 Director는 조립이 완성된 Toy를 반환한다.

(1) Pooh Builder

Director director = new Director();
PoohBuilder poohBuilder = new PoohBuilder();

director.setToyBuilder(poohBuilder);

Toy toy = director.constructToy();
System.out.println(toy);
[실행 결과]
<Pooh>
hair = Yellow
clothes = Red short sleeved T-shirt
pants = null
shoes = null

(2) ZzangGu Builder

Director director = new Director();
ZzangGuBuilder zzangGuBuilder = new ZzangGuBuilder();

director.setToyBuilder(zzangGuBuilder);

Toy toy = director.constructToy();
System.out.println(toy);
[실행 결과]
<ZzangGu>
hair = Short black
clothes = Red short sleeved T-shirt
pants = Yellow shorts
shoes = null


소스 코드

전체 소스 코드

/* Builder */
package builder;

import product.Toy;

public abstract class ToyBuilder {
    protected Toy toy;

    public Toy getToy() {
        return toy;
    }

    public ToyBuilder create() {
        toy = new Toy();
        return this;
    }

    public abstract ToyBuilder buildName();
    public abstract ToyBuilder buildHair();
    public abstract ToyBuilder buildClothes();
    public abstract ToyBuilder buildPants();
    public abstract ToyBuilder buildShoes();
}
/* Concrete Builder */
package builder;

public class PoohBuilder extends ToyBuilder {
    @Override
    public ToyBuilder buildName() {
        toy.setName("Pooh");
        return this;
    }

    @Override
    public ToyBuilder buildHair() {
        toy.setHair("Yellow");
        return this;
    }

    @Override
    public ToyBuilder buildClothes() {
        toy.setClothes("Red short sleeved T-shirt");
        return this;
    }

    @Override
    public ToyBuilder buildPants() {
        return this;
    }

    @Override
    public ToyBuilder buildShoes() {
        return this;
    }
}
/* Director */
package director;

import builder.ToyBuilder;
import product.Toy;

public class Director {
    private ToyBuilder toyBuilder;

    public void setToyBuilder(ToyBuilder toyBuilder) {
        this.toyBuilder = toyBuilder;
    }

    public Toy constructToy() {
        return toyBuilder.create()
                .buildName()
                .buildHair()
                .buildClothes()
                .buildPants()
                .buildPants()
                .getToy();
    }
}
import builder.PoohBuilder;
import builder.ZzangGuBuilder;
import director.Director;
import product.Toy;

public class Main {
    public static void main(String[] args) {
        Director director = new Director();

        PoohBuilder poohBuilder = new PoohBuilder();
        ZzangGuBuilder zzangGuBuilder = new ZzangGuBuilder();

        director.setToyBuilder(poohBuilder);
        //director.setToyBuilder(zzangGuBuilder);

        Toy toy = director.constructToy();

        System.out.println(toy);
    }
}



:bookmark: REFERENCE
에릭 감마 외 3명, 「GoF의 디자인 패턴」, 피어슨에듀케이션코리아
빌더 패턴