Builder Pattern(빌더 패턴)

YeongUng Kim·2021년 5월 16일
1

디자인패턴

목록 보기
3/4
post-thumbnail

개요

복잡한 인스턴스를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 따로 분리 하여 다른 표현이라도 이를 생성할 수 있는 절차를 통일하는 디자인 패턴.
빌더 패턴은 인스턴스를 만드는 절차를 추상화,구조화 하는 생성 패턴 이다. 생성 패턴(creational pattern) 에 관한 내용은 나중에 따로 포스팅을 해야할 것 같다...


본론

Class Diagram

  • Builder : Prouduct 객체의 요소들을 생성하기 위한 추상 인터페이스를 정의

  • ConcreteBuilder : Builder에서 정의해둔 인터페이스를 구현, 각 Product의 요소들을 정의,구축하고 관리하며 복합 인스턴스(Product)가 어떻게 구성되는지에 관한 절차를 정의(표현방법 정의)

  • Director : Builder 인터페이스를 사용하는 객체를 합성(생성)

  • Product : 빌더패턴을 이용하여 생성된 인스턴스

설명

사용자는 Director 객체를 생성하고 자신이 원하는 Builder 인스턴스를 생성해 나간다. Product가 점차 구축될때마다 Director는 Builder에 이를 통보한다. 이때, Builder는 Director 에게서 요청된 명령을 처리하여 Product를 점차 구성해 나가게 된다. 사용자는 Builder를 통해 Product를 획득한다.
'조금씩 조금씩 생성해 나간다' 정도로 이해하면 될려나..

사용예

  • 복합 인스턴스의 생성 알고리즘이 복합 인스턴스의 조립 방법에 독립적일때

  • 합성할 인스턴스의 표현이 서로 다르더라도 생성 절차를 지원해야 할때


예제

Programmer(Product)

// Product
public class Programmer {
    private String gender;
    private String lang;
    public void setGender(String gender) {
        this.gender = gender;
    public void setLang(String lang) {
        this.lang = lang;
    }
    public void show(){
        System.out.println("Gender : "+this.gender+" "+"Lang : "+this.lang);
    }
}

ProgrammerBuilder(Builder)

// Builder
public abstract class ProgrammerBuilder {
    protected Programmer programmer;
    public Programmer getProgrammer() {
        return programmer;
    }
    public void createProgrammer(){
        programmer = new Programmer();
    }
    public abstract void buildGender();
    public abstract void buildLang();
}

CProgrammerBuilder(Concrete Builder)

// Concrete Builder
public class CProgrammerBuilder extends ProgrammerBuilder {
    @Override
    public void buildGender() {
        programmer.setGender("M");
    }
    @Override
    public void buildLang() {
        programmer.setLang("C");
    }
}

JavaProgrammerBuilder(Concrete Builder)

// concrete Builder
public class JavaProgrammerBuilder extends ProgrammerBuilder{
    @Override
    public void buildGender() {
        programmer.setGender("F");
    }
    @Override
    public void buildLang() {
        programmer.setLang("JAVA");
    }
}

Coding(Director)

public class Coding {
    private ProgrammerBuilder builder;
    public void setBuilder(ProgrammerBuilder builder) {
        this.builder = builder;
    }
    public Programmer getProgrammer(){
        return builder.getProgrammer();
    }
    public void consturctProgrammer(){
        builder.createProgrammer();
        builder.buildGender();
        builder.buildLang();
    }
}

Client

public class Client {
    public static void main(String[] args) {
        // Director 생성
        Coding coding = new Coding();
        //Concrete Builder 생성
        ProgrammerBuilder cprogrammer = new CProgrammerBuilder();
        ProgrammerBuilder javaprogrammer = new JavaProgrammerBuilder();
        coding.setBuilder(cprogrammer);
        coding.consturctProgrammer();
        Programmer c = coding.getProgrammer(); // product 획득
        c.show();
        coding.setBuilder(javaprogrammer);
        coding.consturctProgrammer();
        Programmer java = coding.getProgrammer(); // product 획득
        java.show();
    }
}

실행결과

Gender : M Lang : C
Gender : F Lang : JAVA

abstract class ProgrammerBuilder 를 정의하고 이를 구체화한 cProgrammerBuilder , javaProgrammerBuilder를 Concrete Builder를 정의했다. Director는 Coding 이라고 정의했고 클라이언트에서 Coding 인스턴스를 통해 각 Product(Programmer)를 생성했다.


마치며

이펙티브 자바의 빌더패턴과 GoF 에서의 빌더패턴이 이름만 같고 다르다.... 처음엔 같은줄 알고 봤는데 달라서 적잖이 당황했다 왜 이름을 같게 만들어서 사람 햇갈리게 하나 ㅋㅋ 그래서 다음은 이펙티브 자바의 빌더패턴을 다뤄볼 예정이다.

출처: GoF의 디자인패턴

profile
기록하지 않으면 까먹어서 만든 블로그..

0개의 댓글