취업과 기본기 튼튼/빽 투더 기본기

[디자인 패턴 4편] 생성 패턴, 빌더 (Builder)

흠시 2020. 2. 17. 22:57

여기서 말하는 빌더 패턴은 GoF 의 책에서 소개하는 Builder 패턴이 아니라, Effective JAVA 2/E 에서 소개되는 Builder 패턴입니다. 개인적으로 후자가 더 많이 쓰이는 것을 보았어서, Effective JAVA 에서 소개되는 패턴을 기준으로 정리합니다.

1. 개념

빌더 패턴은 생성 인자가 많을 시,
빌더 객체를 통해 구체적인 객체를 생성한다.

1.1. 장점

  • 객체 생성에 필요한 파라미터의 의미를 코드 단에서 명확히 알 수 있다. (가독성이 좋다.)
  • 생성에 필요한 파라미터가 추가될 때 마다, 생성자 오버로딩을 안해도 된다.

1.2. 단점

  • 추가적인 빌더 클래스 구현해야 함.

1.3. 활용 상황

  • 생성자 인자가 많은 경우.

예를 들면 다음 코드보다,

WebBrowser browser = new WebBrowser();
browser.setSslEnabled(true);
browser.setPlugins(new FlashPlugin());
browser.setCookieEnabled(true);

빌더 패턴을 적용한 다음 코드가 훨씬 가독성도 좋고, 코딩하기도 편하다.

WebBrowser browser = new BrowserBuilder()
    .withSsl()
    .withFlashPlugin()
    .withCookieSupport()
    .build();

2. 구조 & 코드

솔직히 JDM님 블로그에 너무나 잘 설명되어 있어서, 링크만 걸어둔다.

 

빌더 패턴(Builder Pattern) :: JDM's Blog

간만에 작성하는 디자인 패턴 포스트입니다. 이번 포스트에서는 빌더 패턴Builder Pattern에 대해 알아보고자 합니다. Builder Pattern 빌더 패턴은 추상 팩토리 패턴이나 팩토리 메소드 패턴과는 조금 다릅니다. 빌더 패턴도 새로운 객체를 만들어서 반환하는 패턴이긴 하지만 실제 동작 방식은 조금 다릅니다. 빌더 패턴은 생성자에 들어갈 매개 변수가 많든 적든 차례차례 매개 변수를 받아들이고 모든 매개 변수를 받은 뒤에 이 변수들을 통합해서 한

jdm.kr

빌더 클래스를 만드는데, 가장 핵심이 되는 부분은 다음 파트다.

public class PersonInfoBuilder {
    private String name;
    ...

    public PersonInfoBuilder setName(String name) {
        this.name = name;
        return this;
    }

    ...

    public PersonInfo build(){
        PersonInfo personInfo = new PersonInfo(name, age, favoriteColor, favoriteAnimal, favoriteNumber);
        return personInfo;
    }
}
  • Setter 의 리턴 값으로 this 를 내보내어, 활용하는 입장에서는 chain 형식으로 메쏘드를 호출할 수 있게 한 것.
  • build 로 최종적으로 builder 에 담긴 정보로 객체를 만든다는 것.

3. 참고