hello world

builder pattern (빌더패턴) 본문

WEB/java

builder pattern (빌더패턴)

sohyun_92 2023. 4. 5. 09:42
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