[디자인패턴]빌더 패턴(Builder Pattern)

Coffee Time☕·2021년 6월 3일
0

디자인 패턴

목록 보기
4/13

빌더 패턴이란?

예약 프로그램을 작성한다고 상상해보자.
사용자가 예약을 하기 위한 정보를 입력값으로 넣는데, 입력하지 않는(필수적이지 않아) 값이 있을 수도 있다. 이러한 경우 객체를 어떻게 생성해야할까? 생성자를 파라미터의 입력받는 가지 수로 일일이 재정의하는 방법 말고 어떤 방법으로 객체를 생성할 수 있을까?
이때 사용하는 것이 빌더 패턴이다.

빌더 패턴은 객체를 생성하기 전에 점진적으로 객체의 정보를 수집하는 패턴이다. 즉, 생성자의 매개 변수가 많은 경우 순차적으로 받아 들일 수 있도록 하는 패턴이다.

빌더 패턴을 적절히 이용하면 생성하는 절차를 추상화하여 사용할 수 있다. 따라서 생성 패턴의 하나이다.

빌더 패턴 예시

아래는 User의 정보를 담은 클래스이다.

public class User{
	private String firstName; //required
	private String lastName; //required
    priavte int age;  //optional 
    
    public sString getFirstName(){
    	return firstName;
     }
    public String setFirstName(String firstName)
    	this.firstName = firstName;
	}
    public String getLastName(){
    	return lastName;
    }
    public String setLastName(String lastName){
    	this.lastName = lastName;
     }
     public String getAge(){
     	return age; 
     }
     public String setAge(int age){
     	this.age = age; 
      }
      

이와 같이 생성된 경우, getter과 setter 만으로 파라미터를 설정하려고 한 것을 볼 수 있다. setter을 모두 호출하여 값을 생성하게 되는데, 이를 경우 값이 모두 세팅이 되지 않은 값에 대해서 클라이언트는 값이 세팅 되었다고 판단할 수도 있다.
따라서 다음과 같이 수정하는 것이 적절하다.

public class UserBuilder{
	private String firstName; 
    private String lastName; 
    private int age; 
    
    public UserBuilder(String firstName, String lastName){ 
    	this.firstName = firstName; 
        this.lastName = lastName;
    }
    public UserBuilder age(int age){ 
    	this.age = age; 
        return this; 
    } 

     public User build(){
       	return new User(this); 
     }
 }
//클라이언트 
UserBuilder userBuilder = new UserBuilder();
User user1 = userBuilder('Kim', 'Jinnie')
		.age(25)
            	.build(); 

3개의 댓글

comment-user-thumbnail
2021년 6월 3일

안녕하세요 질문이 있습니다.
UserBuilder 클래스에서 각 setter가 this를 return해야되는게 아닌가요??
setAge도 있는데 생략하신게 맞나요?
lombok 이용해서 builder를 쓰다가 직접 구현하는 걸 보고 궁금해서 문의드립니다!

1개의 답글