빌더 패턴 (Builder Pattern)
- 객체 생성 패턴
- 생성자의 인자가 많은 경우, 생성자의 인자들 중에 필수적 인자와 선택적 인자가 혼합되어 있는 경우 사용
- 또한 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 어노테이션을 붙여주면 된다.