설계 패턴

빌더 패턴 (Builder Pattern)

연결리스트 2020. 10. 6. 14:53

 - 객체 생성 패턴 

 - 생성자의 인자가 많은 경우, 생성자의 인자들 중에 필수적 인자와 선택적 인자가 혼합되어 있는 경우 사용 

 - 또한 immutable 객체 (변경, 수정할 수 없는 객체)를 생성하고 싶은 경우에도 사용 

 

 - 점층적 생성자 패턴의 경우 인자가 많을수록 생성자 개수도 많아진다. 

   생성자의 개수가 많기때문에 인자가 어떤 의미인지 파악하기 힘들고 가독성이 떨어진다는 문제점이 있다.

 - JavaBeans 패턴의 경우 setter 메서드로 각 속성의 값을 설정하는 경우, 가독성은 향상되나 

   immutable object를 만들 수 없다는 문제점이 있다.

 

 

 - Builder 패턴 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class Book {
        private Long id; //필수
        private String isbn; //필수
        private String title;
        private String author;
        private int pages;
        private String category;
 
 
        public static class BookBuilder {
            private Long id; //필수
            private String isbn; //필수
            private String title;
            private String author;
            private int pages;
            private String category;
 
            public BookBuilder(Long id, String isbn) {
                this.id = id;
                this.isbn = isbn;
            }
 
            public BookBuilder title(String title) {
                this.title = title; return this;
            }
            public BookBuilder author(String author) {
                this.author = author; return this;
            }
            public BookBuilder pages(int pages) {
                this.pages = pages; return this;
            }
            public BookBuilder category(String category) {
                this.category = category; return this;
            }
 
            public Book build() {
                Book book = new Book();
                book.id = this.id;
                book.isbn = this.isbn;
                book.author = this.author;
                book.title = this.title;
                book.pages = this.pages;
                book.category = this.category;
                return book;
            }
 
            public Long getId() {
                return id;
            }
 
            public String getIsbn() {
                return isbn;
            }
 
            public String getTitle() {
                return title;
            }
 
            public String getAuthor() {
                return author;
            }
 
            public int getPages() {
                return pages;
            }
 
            public String getCategory() {
                return category;
            }
        }
}
 
cs

 

 - method chaining을 위해 BookBuilder의 this로 반환해주며, Builder의 setter 타입은 void형이 아닌 Builder 형이다.

 - Build 메서드는 인스턴스를 생성한뒤 설정받은 속성값을 전달해주고 인스턴스를 반환해준다. 

 - Build 메서드에서 최종적인 완결작업을 하는 것이다. 

 - Builder 패턴을 통해 가독성 개선, 메서드 체이닝, immutable 생성이 가능해진다.

 

Lombok @Builder Annotation 사용

 - Lombok @Builder 어노테이션을 사용하면 코드를 직접 작성할 필요없이 구현이 가능하다. 

 - lombok.Builder을 import하고 @Builder 어노테이션을 붙여주면 된다.

 - 필수적 인자인 경우 인자 위에 @nunNull 어노테이션을 붙여주면 된다.