https://pamyferret.tistory.com/67
https://mangkyu.tistory.com/163
https://velog.io/@sally_devv/Builder-%ED%8C%A8%ED%84%B4-Dto
1. 점층적 생성자 패턴(Telescoping Constructor Pattern)
생성자를 다른 여러 형태로 만들어서 사용하는 방식
public class Member{
private String name; //필수
private String nickname; // 필수
private String gender; //선택
private String email; //선택
public Member(String name, String nickname){ // 필수 변수 생성자 추가
this.name = name;
this.nickname = nickname;
}
public Member(String name, String nickname, String gender){
this.name = name;
this.nickname = nickname;
this.gender = gender;
}
public Member(String name, String nickname, String email){
this.name = name;
this.nickname = nickname;
this.email = email;
}
public Member(String name, String nickname, String gender, String email){
this.name = name;
this.nickname = nickname;
this.gender = gender;
this.email = email;
}
}
Member member = new Member("kimsky", "sky", "여", "sky@mail.com");
단점
인자들이 많아질 수록 생성자가 많아짐
매개변수의 정보(위치와 타입)를 알 수 없으므로 가독성이 떨어지고 코드 수정이 필요한 경우 코드 수정이 복잡함
변수가 추가/삭제 되는 경우 기존 코드를 수정해야함
2. 자바 빈즈 패턴(JavaBeans Pattern)
getter/setter를 이용하여 객체를 생성할 때 필드를 주입하는 방식
public class Member{
private String name; //필수
private String nickname; //필수
private String gender; //선택
private String email; //선택
public Member(){
}
public void setName(String name){
this.name = name;
}
public void setNickname(String nickname){
this.nickname = nickname;
}
public void setGender(String gender){
this.gender = gender;
}
public void setEmail(Stirng email){
this.email = email;
}
}
Member member = new member(); // 객체 생성 후 값 넣음
member.setName("kimsky");
member.setNickname("sky");
member.setGender("여");
member.setEmail("sky@mail.com");
장점
점층적 생성자 패턴에 비해 가독성이 좋음
단점
코드량이 늘어남
setter메서드를 통해 값이 계속 변할 수 있기 때문에 객체 일관성이 깨짐(객체 생성 후 값을 넣기 때문에)
3. 빌더 패턴(Builder Pattern)
객체 생성을 위한 디자인 패턴(Refactoring Guru) 중 하나
점층적 생성자 패턴과 자바 빈즈 패턴을 보완한 것이 빌드 패턴
데이터는 자바 빈즈 패턴처럼 받고, 데이터 일관성을 위해 데이터를 다 받은 후 객체를 생성함
package com.example.todo_app.domain;
public class Member {
private String name; // 필수
private String nickname; // 필수
private String gender; // 선택
private String email; // 선택
public static class Builder {
private final String name;
private final String nickname;
private String gender;
private String email;
// 필수 변수는 생성자로 값을 넣음
public Builder(String name, String nickname) {
this.name = name;
this.nickname = nickname;
}
// 멤버 변수별 메서드: 빌더 클래스의 필드값을 set, 빌더 객체 리턴
public Builder gender(String gender) {
this.gender = gender;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
// 빌더 메서드
public Member build() {
Member member = new Member();
member.name = this.name;
member.nickname = this.nickname;
member.gender = this.gender;
member.email = this.email;
return member;
}
Member memberEntity = new Builder("kimsky", "sky")
.gender("여")
.email("sky@mail.com")
.build();
}
}
장점
가독성을 높임
- 불필요한 생성자 제거, 명시적 선언으로 각 인자의 의미를 알기 쉬움
인수 확장에 용이
필요한 데이터만 설정 가능
- 데이터 순서에 상관 없이 객체 생성 가능
객체 불변성
- setter메서드를 사용하지 않으므로 변경 불가능한 객체를 만들 수 있음
단점
객체 생성 전에 빌더 객체 생성 필요
빌더 패턴을 사용하면 좋은 경우
인자들이 최소 4개 이상으로 많은 경우
선택적 인자들이 많은 경우
추가될 인자들이 많은 경우
주의
- 변수가 2개 이하이거나, 변경 가능성이 없는경우 빌더패턴의 장점이 무의미함
- 빌더 패턴이 점층적 생성자 패턴, 자바빈즈 패턴보다 항상 좋은 패턴은 아님, 상황에 맞게 판단하여 사용해야함
LomBok @Builder 어노테이션
- Builder 클래스를 따로 개발하지 않고 Builder패턴을 사용해 객체를 생성할 수 있음
import lombok.Builder;
@Builder
public class Member {
private String name;
private String nickname;
private String gender;
private String email;
}
Builder 메서드 사용법
public static void main(String[] args) {
Member member = Member.builder()
.name("kimsky")
.nickname("sky")
.gender("여")
.email("sky@mail.com")
.build();
}
더 알아보기: 생성자패턴, 수정자패턴, 정적 메소드 패턴
'오늘의 공부 & 기록' 카테고리의 다른 글
H2 DB와 인텔리제이(IntelliJ) 연동으로 더 간편하게 DB사용하기 (0) | 2022.12.23 |
---|---|
RuntimeException 런타임 예외 종류 (0) | 2022.11.29 |
📝 쿠키와 세션 (0) | 2022.11.18 |
프로그래밍 케이스 스타일(Case Styles) 카멜/케밥/파스칼/스네이크 (0) | 2022.11.15 |
로그인, 로그아웃 기능 구현 (0) | 2022.11.12 |