본문 바로가기
Java

[Java] Builder Pattern 그리고 @Builder annotaion

by clolee 2022. 9. 19.

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

 

 

 

 

 

댓글