Builder 패턴 이란?

복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴.

Builder 패턴을 사용하는 이유

// Basic
class Student(id: number, name: string, major: string, age: number, address: string) {
		id     : number;
		name   : string;
		major  : string;
		age    : number;
		address: string;
		
		constructor() {
				this.id = id;
				this.name = name;
				this.major = major;
				this.age = age;
				this.address = address;
		}
}

const student = new Student(20220103, '조준석', '정보통신', null, '서울시 노원구...'); 

점층적 생성자 패턴**(telescoping constructor pattern)**

클래스 내에 오버로딩을 통해서 생성자를 여러 개 작성하는 것을 말한다.

public class Member {
	
    private String name;				// 필수
    private int age;				   	// 필수
    private String address;			// 선택
    private String phone;				// 선택
    private String email;  			// 선택
    
    // 필수 매개변수를 가지는 생성자
    public Member(String name, int age) {
    	this(name, age, null, null, null);
    }
    
    // 선택 매개변수 address가 추가된 생성자
    public Member(String name, int age, String address) {
    	this(name, age, address, null, null);
    }
    
    // 선택 매개변수 phone이 추가된 생성자
   	public Member(String name, int age, String address, String phone) {
    	this(name, age, address, phone, null);
    }
    
    // 모든 매개변수를 가지는 생성자
    public Member(String name, int age, String address, String phone, String email) {
    	this.name = name;
        this.age = age;
        this.address = address;
        this.phone = phone;
        this.email = email;
    }
}

Member member1 = new Member("홍길동", 56);
// { name: "홍길동", age: 56, address: null, phone: null, email: null }

Member member2 = new Member("조준석", 29, "서울시 노원구", "01012345678");
// { name: "조준석", age: 29, address: "서울시 노원구", phone: "01012345678", email: null }

자바 빈 패턴**(Java Bean pattern)**

매개변수가 없는 생성자로 객체를 만든 후, Setter 메서드를 호출해 원하는 매개변수의 값을 설정하는 방식이다.

public class Member {
		private final String name;				
    private final int age;				   	
    private final String address;			
    private final String phone;				
    private final String email;
		
		public Member() {}

		// Setter 메서드
		public void setName(String name) {
				this.name = name;
		}
		public void setAge(int age) {
				this.age = age;
		}
		public void setAddress (String address) {
				this.address = address;
		}
		public void setPhone(String phone) {
				this.phone = phone;
		}
		public void setEmail(String email) {
				this.email = email;
		}
}

Member member = new Member();
member.setName('조준석');
member.setAge(29);
// { name: "조준석", age: 29 }
// 객체 일관성이 깨질 수 있으며, 불변성 객체를 만들 수 없다.

Builder 패턴의 장점과 단점

장점

// 단순 생성자로 만들 때 예시
const student = new Student(null, '조준석', null, 29, null);

// Builder Pattern 호출 예시
const student = Student.builder().name('조준석').age(29);