본문 바로가기
Languages/디자인패턴

[Java] 빌더(Builder) 패턴

by yoon_seon 2023. 6. 8.

Builder 패턴 이란

Builder 패턴은 객체 생성을 위한 디자인 패턴 중 한 방법으로, 간단한 클래스 객체를 생성할 때는 괜찮겠지만 복잡한 클래스 객체를 한 번에 생성하기는 많은 어려움이 있을 수 있기 때문에 구조를 이루는 필드를 하나씩 만들어 가는 방법이다.

 

Builder 패턴 적용

public class Text {
    private String text;

    public Text(String text) {
        this.text = text;
    }

    public Text() {}

    @Override
    public String toString() {
        return text;
    }

    public static class Builder {
        private String title;
        private String content;
        private String[] items;

        public Builder setTitle(String title) {
            this.title = title;
            return this;
        }

        public Builder setContent(String content) {
            this.content = content;
            return this;
        }

        public Builder setItems(String ... items) {
            this.items = items;
            return this;
        }

        public Text build() {
            Text text = new Text();
            StringBuilder sb = new StringBuilder();
            sb.append("타이틀 : ").append(title).append("\n");
            sb.append("내용 : ").append(content).append("\n");
            sb.append("항목 : ").append("\n");
            for (String item : items) {
                sb.append(" - ").append(item).append("\n");
            }
            text.text = sb.toString();
            return text;
        }
    }
}
  • Text 클래스에 Builder 클래스를 내부클래스로 선언
  • Builder 클래스에 setXXX 메서드를 생성하고 필드에 데이터를 주입
  • Builder 클래스에 build 메서드를 생성하고 객체를 Text 외부 클래스에 담아 반환

 

다음과 같이 호출하여 객체를 생성할 수 있다.

public static void main(String[] args) {
    Text text = new Text.Builder()
            .setTitle("hello")
            .setContent("내용")
            .setItems("항목1", "항목2", "항목3")
            .build();
    System.out.println(text);
}

 

빌드 패턴을 사용하지 않았다면?

public class Text {
    private String title;
    private String content;
    private String[] items;
    
    public Text(String title) {
        this.title = title;
    }
    
    public Text(String title, String content) {
        this.title = title;
        this.content = content;
    }
    
    public Text(String title, String content, String[] items) {
        this.title = title;
        this.content = content;
        this.items = items;
    }
    
    public Text() {}
}

빌더 패턴을 사용하지 않았다면 다음과 같이 생성하고자 하는 객체를 위한 생성자를 각각 만들거나 정적 메서드를 만들어서 원하는 객체를 만들었어야 했을 것이다.

필드가 많아지고 생성해야하는 객체의 형태가 많을수록 소스가 지저분해져 가독성이 떨어진다.

 

Builer Pattern의 장점

  • 가독성을 높혀 이해하기 쉽기 때문에 유지보수가 편리하다.
  • 객체 생성에 유연성을 확보할 수 있다.
  • 필요한 필드만 설정하여 객체를 생성할 수 있다.

 

롬복 라이브러리를 통해 빌드패턴 구현 로직을 생략할 수 있다.

 

 

댓글