Builder 패턴은 Creational Design Pattern이다.
책 정보를 정리하는 프로그램을 만들고자 한다. 책의 정보에는 제목, isbn, 저자, 출판사, 출판연도 등이 담겨있다. 나는 필수 정보로 제목과 isbn이 들어가게 하고 싶다. 다른 정보는 있어도 좋고 없어도 좋다!
1. Telescoping Constructor Pattern(점층적 생성자 패턴)
평소 알고 있는 정보로 프로그램을 작성한다면
public class Book {
private String title;
private String isbn;
private String author;
private int pages;
private String category;
public Book(String title, String isbn) {}
public Book(String title, String isbn, String author) {}
public Book(String title, String isbn, String author, int pages) {}
public Book(String title, String isbn, String author, int pages, String category) {}
}
이처럼... title, isbn을 필수로 하고 남은 정보를 선택적으로 갖는 생성자 여럿을 만들어 내가 사용할 생성자를 골라서 사용할 수 있다. 이를 ✅ Telescoping Constructor Pattern(점층적 생성자 패턴) 이라 한다.
telescoping constructor pattern에는 문제가 있다. 같은 형식을 매개변수로 받는 title, isbn 등의 입력이 순서가 뒤바뀐 채 들어와도 문제 없이 Book class가 만들어진다는 것이다.
Book book1 = new Book("12345", "홍길동전", "한빛미디어");
이처럼 제목, isbn, 저자를 엉망진창으로 적어도 book1은 정상적인 Book 취급을 받는다! 다른 방법을 찾아보자.
2. JavaBeans Pattern
평소 잘 활용했던 getter setter를 활용하는 방법이다. setter 메서드를 사용하여 속성 값을 추가해주는 방법이다.
public class Book {
private String title;
private String isbn;
private String author;
private int pages;
private String category;
public Book() { }
public void setTitle(String title) { this.title = title; }
public void setIsbn(String isbn) { this.isbn = isbn; }
public void setAuthor(String author) { this.author = author; }
public void setPages(int pages) { this.pages = pages; }
public void setCategory(String category) { this.category = category; }
}
이렇게 생성자에서는 인자 값을 받지 않고 나중에 추가로 속성을 부여한다. 그러나 setter를 사용하면 immutable object(생성된 후 수정이 불가한 객체)를 생성할 수 없다.
3. Builder Pattern
그래서 나온 것이 빌더 패턴이다. Lombok에서 제공하는 @Builder를 활용하여 코드를 아주 쉽게 작성할 수 있다.
import lombok.Builder;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
@Setter
@Getter
@Builder
public class Book {
@NonNull
private String title;
@NonNull
private String isbn;
private String author;
private int pages;
private String category;
}
Book class에 @Setter, @Getter를 추가해주면 settter, getter를 따로 설정해주지 않아도 getTitle() 등의 메서드를 바로 사용할 수 있다. String title과 String isbn위에 @NonNull을 추가해 두 인자는 반드시 설정되어야 하는 인자임을 표현했다.
Book book1 = new Book.BookBuilder().title("홍길동전").isbn("1234").build();
System.out.println(book1.getTitle());
이처럼 new Book.BookBuilder()를 통해 Book을 생성할 수 있다. 필수 인자 2개를 설정해줬다! getTitle()을 통해 인자를 받아온다!
https://refactoring.guru/ko/design-patterns/builder
빌더 패턴
/ 디자인 패턴들 / 생성 패턴 빌더 패턴 다음 이름으로도 불립니다: Builder 의도 빌더는 복잡한 객체들을 단계별로 생성할 수 있도록 하는 생성 디자인 패턴입니다. 이 패턴을 사용하면 같은 제작
refactoring.guru
'공부 > 소프트웨어공학' 카테고리의 다른 글
[디자인패턴] 템플릿 메서드(Template Method) 패턴이란? (0) | 2024.11.15 |
---|---|
[디자인패턴] 데코레이터(Decorator) 패턴이란? (0) | 2024.11.14 |
[디자인패턴] 옵서버(Observer ) 패턴이란? 또는 Event-Listener (0) | 2024.11.09 |
[디자인패턴] 커맨드(Command) 패턴이란? (0) | 2024.11.08 |
[디자인패턴] 스트래티지(Strategy) 패턴이란? (0) | 2024.11.08 |