빌더 패턴(Builder Pattern)은 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴이다.
생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식이다.
빌더를 쓰는 이유는
생성자 파라미터가 많을 경우 가독성이 좋지 않다.
생성자로 설정해야하는 값이 많을 경우 빌더를 쓰는 것이 생성자보다 가독성이 좋다. 이는 같은 타입의 다른 변수의 값을 서로 바꿔 넣는 것을 방지할 수도 있다.
생성자의 경우는 정해진 파라미터 순서대로 꼭 값을 넣어줘야한다. 순서를 무시하고 값을 넣으면 에러가 발생하거나 엉뚱한데 값이 들어갈 수 있다.
하지만 빌더 패턴은 빌더의 필드 이름으로 값을 설정하기 때문에 순서에 종속적이지 않다.
그냥 쓰이는 곳에서 어떤 필드를 먼저 설정해야하는지 굳이 순서를 생각할 필요 없이 편하게 설정하면 된다.
package chapter20230829.BuilderPatton;
public class Account {
/*
객체 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 얻을 수 있게 하는 패턴을 의미
java에서 객체의 초기화와 생성을 캡슐화 하는데 유용하게 사용
*/
private int accID;
private int balance;
private String cusName;
// 모든 필드를 사용하는 생성자가 필요
public Account(int accID, int balance, String cusName) {
this.accID = accID;
this.balance = balance;
this.cusName = cusName;
}
@Override
public String toString() {
return "Account [accID=" + accID + ", balance=" + balance + ", cusName=" + cusName + "]";
}
public static class Builder {
// 외부 클래스와 동일한 필드를 가짐
private int accID;
private int balance;
private String cusName;
// 빈 생성자 객체생성
Builder() {}
// 체이닝 메서드 사용을 위해 객체반환
public Builder accID(int accID) {
this.accID = accID;
return this;
}
public Builder balance(int balance) {
this.balance = balance;
return this;
}
public Builder cusName(String cusName) {
this.cusName = cusName;
return this;
}
public Account build() { // Account build() - 데이터 타입이 Account인 build()메서드를 만들어서 실행하면 new Account를 반환
return new Account(this.accID, this.balance, this.cusName);
}
}
}
package chapter20230829.BuilderPatton;
public class test01 {
public static void main(String[] args) {
/*
예를 들어 클래스의 필드가 10개이고
객체 생성시에 일정하지 않은 여러개의 조합으로 객체를 생성할 경우
많은 수의 생성자를 만들어야 함
빌더패턴은 유연하게 일정하지 않은 초기값으로 객체를 생성할 수 있음
*/
Account account1 = new Account.Builder().accID(222).build();
System.out.println(account1);
Account account2 = new Account.Builder().accID(222).balance(10000).build();
System.out.println(account2);
Account account3 = new Account.Builder().accID(222).balance(10000).cusName("홍길동").build();
System.out.println(account3);
Account account4 = new Account.Builder().balance(10000).cusName("홍길동").build();
System.out.println(account4);
Account account5 = new Account.Builder().cusName("홍길동").build();
System.out.println(account5);
}
}