빌더 패턴이란? 객체 생성 패턴
▶ 생성자의 인자가 많은 경우
▶ Immutable 객체 (변경할 수 없는 객체)를 생성하고 싶은 경우 (수정 불가한 객체)
▶ 생성자의 인자들 중 반드시 데이터를 제공해야 하는 필수적 인자와 없어도 되는 선택적 인자가 혼합돼있는 경우
Telescoping Constructor 패턴 (점층적 생성자 패턴)
▷ 생성자 점점 추가시켜 속성 정보 설정해 객체 생성!
▷ 필수 인자를 받는 생성자 정의 후에 선택적 인자 추가로 받는 생성자 계속해서 정의
점층적 생성자 패턴의 문제점 (Telescoping Constructor 패턴)
1. 인자가 많을수록 생성자 개수 많아짐
2. 생성자의 인자가 어떤 의미인지 파악 힘듦 (intellij에선 매개변수가 나오기 때문에 알고 있지만, 이런 기능 제공 않는 editor 프로그램에선 파악 힘듦)
3. 동일한 타입 인자인 경우
4. 가독성 떨어짐 (예로, category는 쓰고 싶은데 author, title 은 넣기 싫은 경우 → null 넣어야함)
해결법? JavaBeans 패턴 → setter 메소드 제공 (setter 메소드로 각 속성의 값 설정)
▷ 가독성은 향상되나, immutable object (언제라도 객체값 바꿀 수 있는 불변의 객체) 만들 수 x
Builder 패턴 → 만들고자 하는 인스턴스에 대해 builder 제공 (인스턴스 생성 기능 갖고있음)
BookBuilder → 필수 인자 설정 할 수 있는 빌더 생성자! 필수 인자인id, isbn을 생성자로 받음
setter 메소드인데, ‘set’ 빼고 속성 이름으로 대신한 것임!
return this → this 는 BoookBuilder 인스턴스 가리킴 (메소드 chaining 위한 것)
Book build() →이걸 통해야만 builder 인스턴스에서 Book 인스턴스로 인자 전달됨
book 인스턴스에 해당하는 속성 값에 설정 받은 속성 값 전달해주고 최종적으로 book 전달!
* 빌더 메소드의 최종적인 일? 자신이 갖고 있는 속성 정보를 Book 인스턴스의 속성 정보로 전달해 전달받은 Book 인스턴스 반환하는 것!
Builder 패턴
1. 가독성 개선
2. 메소드 체인닝 (method chaining)
→ 예 : Book book2 = new Book(2L, “isbn1234”).pages(360).Author(“Insang”).build();
→ 인자 순서 중요하지 않음. 순서 상관없음 (return 값이 builder 자신이니까!)
3. immutable 객체 생성 (수정 불가한 객체 생성)
속성 정보 외부에서 가져오는 법 : getter 메소드 두면 됨
빌더 패턴의 문제점? 빌더 클래스 따로 만들어야 하고, 속성수만큼 생성자 만들어야 해서 코드 양이 많아짐 → 빌더 패턴 그대로 사용하며 코드 단순화 → Lombok 이용!
Lombok @Builder annotation 이용
→ Getter/Setter/Builder 자동생성!
필수 인자 위엔 @NonNull 해주기 (Lombok 필수 속성)
'Study > Design Pattern' 카테고리의 다른 글
Observer Pattern (0) | 2021.11.15 |
---|---|
Command Pattern (0) | 2021.11.15 |
Strategy Pattern (0) | 2021.11.15 |
객체지향원리 (0) | 2021.11.15 |