개발/디자인패턴

[Java][디자인 패턴] 5. 빌더 패턴 (Builder Pattern)

nova_dev 2022. 3. 4. 23:59
반응형

디자인패턴
[Java][디자인 패턴] 5. 빌더 패턴 (Builder Pattern)

빌더 패턴은 추상 팩토리를 확장하여 크고 복잡한 객체를 생성할 수 있다.

 빌더 패턴이란?

  • 빌더 패턴은 복잡한 구조를 가진 복합 객체의 생성 과정을 분리하여 처리하는 패턴이다.
  • 복합 객체의 생성 과정을 단계별로 분리함으로써 복합 객체의 생성을 일반화할 수 있다.
  • 추상 클래스인 Builder는 추상 메서드 build()를 선언한다. build()는 복합 객체를 생성하는 로직을 하위 클래스에 위임한다.

 빌더 패턴 구조

Office 빌더 패턴

빌더 패턴을 사용하여 만든 각자의 환경에 맞는 Office를 구성하는 예시 코드이다.
(예시 코드를 조금 대충 만든 것 같기도 한데 그냥 빌더 패턴 구조를 파악하는데 의의를 두자)

 빌더 패턴 코드

1.Builder 추상 클래스

public abstract class Builder {
    protected Office office;

    public Builder createOffice(){
        office = new Office();
        return this;
    }

    public abstract Builder buildWorkspace();
    public abstract Builder buildPc();
    public abstract Builder buildKeyboard();
    public abstract Builder buildMouse();
    public abstract Builder buildWorker();
    public abstract Builder buildMonitor();

    public abstract Office getOffice();
}

2. Office 클래스

public class Office {
    private String workspace;
    private String pc;
    private String keyboard;
    private String mouse;
    private String worker;
    private String monitor;

    public void setWorkspace(String workspace) {
        this.workspace = workspace;
    }

    public void setPc(String pc) {
        this.pc = pc;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    public void setWorker(String worker) {
        this.worker = worker;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }


    @Override
    public String toString() {
        return  worker + "는 오늘도 " + workspace + "에서 " +
                 pc + "과 " + keyboard + "과 " + mouse + "으로 " +
                monitor + "을 보며 열일 중이다.";
    }
}

3. Builder 클래스를 상속해서 만든 CompanyOfficeBuilder, HomeOfficeBuilder

 

public class CompanyOfficeBuilder extends Builder{
    @Override
    public Builder buildWorkspace() {
        office.setWorkspace("회사");
        return this;
    }

    @Override
    public Builder buildPc() {
        office.setPc("맥북");
        return this;
    }

    @Override
    public Builder buildKeyboard() {
        office.setKeyboard("맥북 키보드");
        return this;
    }

    @Override
    public Builder buildMouse() {
        office.setMouse("맥북 터치패드");
        return this;
    }

    @Override
    public Builder buildWorker() {
        office.setWorker("직원");
        return this;
    }

    @Override
    public Builder buildMonitor() {
        office.setMonitor("깐지나는 모니터 하나");
        return this;
    }

    @Override
    public Office getOffice() {
        return office;
    }
}
public class HomeOfficeBuilder extends Builder{
    @Override
    public Builder buildWorkspace() {
        office.setWorkspace("스윗 마이 홈");
        return this;
    }

    @Override
    public Builder buildPc() {
        office.setPc("맥북");
        return this;
    }

    @Override
    public Builder buildKeyboard() {
        office.setKeyboard("키크론 K8");
        return this;
    }

    @Override
    public Builder buildMouse() {
        office.setMouse("로지텍 MX Master");
        return this;
    }

    @Override
    public Builder buildWorker() {
        office.setWorker("노예");
        return this;
    }

    @Override
    public Builder buildMonitor() {
        office.setMonitor("빈티나는 모니터 두개");
        return this;
    }

    @Override
    public Office getOffice() {
        return office;
    }
}

4. Director 클래스
Builder 클래스를 사용해서 오피스를 구성해주는 클래스

public class Director {
    private final Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void build() {
        builder.createOffice()
                .buildWorker()
                .buildPc()
                .buildMonitor()
                .buildMouse()
                .buildKeyboard()
                .buildWorkspace();
    }

    public Office getOffice(){
        return builder.getOffice();
    }
}

5. 테스트 코드

class DirectorTest {

    @Test
    @DisplayName("회사에서 근무하는 환경을 만든다.")
    void buildCompanyOfficeEnv() {
        Builder companyOfficeBuilder = new CompanyOfficeBuilder();
        Director director = new Director(companyOfficeBuilder);
        director.build();

        Office office = director.getOffice();
        System.out.println(office.toString());

        Assertions.assertEquals("직원는 오늘도 회사에서 맥북과 맥북 키보드과 맥북 터치패드으로 깐지나는 모니터 하나을 보며 열일 중이다.",
                office.toString());
    }

    @Test
    @DisplayName("집에서 근무하는 환경을 만든다.")
    void buildHomeOfficeEnv() {
        Builder companyOfficeBuilder = new HomeOfficeBuilder();
        Director director = new Director(companyOfficeBuilder);
        director.build();

        Office office = director.getOffice();
        System.out.println(office.toString());

        Assertions.assertEquals("노예는 오늘도 스윗 마이 홈에서 맥북과 키크론 K8과 로지텍 MX Master으로 빈티나는 모니터 두개을 보며 열일 중이다.",
                office.toString());
    }
}

 Github 코드

Github 예제 코드 링크

Github 예제 테스트 코드 링크

참고 자료

 

 

 

 

 

반응형