Builder Pattern (빌더 패턴)
객체를 생성하는 좋은 방법 중 하나.
constructor에 전달되는 parameter가 많을 때, 각각의 인자가 어떤 의미인지 알 수 있도록 해준다.
파라미터의 순서에 상관없이 객체 생성
BankAccount account = new BankAccount(456L, "Marge", "Springfield", 100.00, 2.5);
↓
BankAccount account = new BankAccount.Builder(1234L)
.withOwner("Marge")
.atBranch("Springfield")
.openingBalance(100)
.atRate(2.5)
.build();
Builder()에는 필수 인자들의 값을 입력
build() 가 객체를 생성해 돌려줌
BankAccount class 참고
publice constructor를 제거하고 builder를 통해 객체를 생성하는 private constructor로 대체
https://dzone.com/articles/design-patterns-the-builder-pattern
public class BankAccount {
public static class Builder {
private long accountNumber; //This is important, so we'll pass it to the constructor.
private String owner;
private String branch;
private double balance;
private double interestRate;
public Builder(long accountNumber) {
this.accountNumber = accountNumber;
}
public Builder withOwner(String owner){
this.owner = owner;
return this; //By returning the builder each time, we can create a fluent interface.
}
public Builder atBranch(String branch){
this.branch = branch;
return this;
}
public Builder openingBalance(double balance){
this.balance = balance;
return this;
}
public Builder atRate(double interestRate){
this.interestRate = interestRate;
return this;
}
public BankAccount build(){
//Here we create the actual bank account object, which is always in a fully initialised state when it's returned.
BankAccount account = new BankAccount(); //Since the builder is in the BankAccount class, we can invoke its private constructor.
account.accountNumber = this.accountNumber;
account.owner = this.owner;
account.branch = this.branch;
account.balance = this.balance;
account.interestRate = this.interestRate;
return account;
}
}
//Fields omitted for brevity.
private BankAccount() {
//Constructor is now private.
}
//Getters and setters omitted for brevity.
}
@Builder 어노테이션
lombok의 @Builder 어노테이션을 통해 builder pattern을 사용할 수도 있다.
클래스 또는 생성자에 @Builder 어노테이션을 붙여주면 빌드 패턴 코드가 빌드 된다.
하지만 직접 만든 생성자에 달아주는 것이 좋다.
@Builder를 클래스에 달아주면 @AllArgsConstructor 도 같이 달아주는 것과 같아 바람직하지 않다.
@Builder 어노테이션은 프로젝트에서 주로 named parameter의 대체제로 사용한다.
참고 :
https://www.tutorialspoint.com/design_pattern/builder_pattern.htm
https://projectlombok.org/features/Builder
https://esoongan.tistory.com/82
https://johngrib.github.io/wiki/pattern/builder/
https://dzone.com/articles/design-patterns-the-builder-pattern
댓글