hello world
builder pattern (빌더패턴) 본문
728x90
빌더패턴을 사용하는 이유
- 불필요한 생성자 만들지 않고, 객체 생성가능
- 생성자의 입력값에 대한 순서가 바뀔 경우에 대한 오류를 줄일 수 있다
- 명시적이고 이해하기 쉬움
- 즉 객체 생성을 깔끔하고 유연하게 하기 위한 기법
점층적 생성자 패턴 --> 자바빈 패턴 --> 빌더패턴 (점층적, 자바빈 패턴 대안으로 나오게됨)
점층적 생성자 패턴
package programmers;
/* 점층적 생성자 패턴 */
public class Member {
private String age;
private String addr;
private String hobby;
public Member() {
}
public Member(String age) {
this.age = age;
}
public Member(String age,String addr) {
this.age = age;
this.addr = addr;
}
public Member(String age,String addr,String hobby) {
this.age = age;
this.addr = addr;
this.hobby = hobby;
}
}
단점
- 모든 인자를 받는 경우의 생성자를 다 만든다.
- 매개 변수가 많아질수록 많은 조합이 만들어지고, 생성자의 수가 많아진다.
- 코드 작성 효율과 가독성이 저하되는 영향을 준다
자바빈 패턴
이 패턴은 setter메서드를 이용해 객체에 값을 세팅한다
package programmers;
/* 자바빈 패턴 */
public class Member {
private String age;
private String addr;
private String hobby;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
Member member = new Member();
Member.setAge(240);
Member.setAddr("seoul");
Member.setHobby("hobby");
장점
- 각 인자의 의미 파악이 쉽다.
- 복잡하게 여러개의 생성자를 만들지 않아도 된다.
단점
- 객체 일관성이 깨진다.
즉, 1회의 호출로 객체 생성이 끝나지 않았다.
한번에 생성하지 않고 생성한 객체에 여러번에 걸쳐 값을 주고있다.
- Setter Method의 존재로 불변 클래스 생성이 불가능하다
Builder 패턴
import lombok.*;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
/* builder pattern */
private String age;
private String addr;
private String hobby;
@Builder
Member(String age,String addr, String hobby){
this.age = age;
this.addr = addr;
this.hobby = hobby;
}
}
Member member = Member.builder()
.age("age")
.hobby("hobby")
.addr("seoul")
.build();
장점
- 가독성이 높은 코드를 작성할 수 있다.
- 선택적으로 객체를 구성할 수 있다.
- 값을 넣지 않으면 null로 값을 반환해주어서 선택적으로 생성자를 구성할 수 있다.
- 무조건적인 setter 생성을 방지하고 불변객체로 생성 할 수 있다.
**** (인텔리제이에서 commond+n 단축키 누르고 Counstructor 누르면 builder 생성자를 쉽게 만들수 있다.)
'WEB > java' 카테고리의 다른 글
SerializationUtils.clone (0) | 2024.01.23 |
---|---|
커스텀 어노테이션 (2) | 2023.01.17 |
VO객체의 변수, 값들을 가져오는 방법 reflect (0) | 2022.07.22 |
자바 30일이 지났는지 체크하는 로직 (2) | 2021.11.08 |
jsonObject 객체 vo(dto) 매핑 (0) | 2021.02.07 |
Comments