본문 바로가기

java

[Java] Builder Pattern

 Builder Pattern 

  • 생성자에 매개변수가 많을 때 사용하는 방법
  • 필수 매개변수 만으로 생성자를 호출해서 빌더 객체를 얻는다. 그 다음 빌더 객체가 제공하는 세터 메소드들로 원하는 선택 매개변수들을 설정한다.
  • 빌더 패턴에 대한 자세한 내용은 이펙티브 자바 item2를 보고 링크에 정리했다. 
public class NutritionFactsBuilder {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder {
        // 필수 매개변수
        private final int servingSize;
        private final int servings;

        // 선택 매개변수 - 기본값으로 초기화
        private int calories = 0;
        private int fat = 0;
        private int sodium = 0;
        private int carbohydrate = 0;

        public Builder(int servingSize, int servings) {
            // 필수 매개변수 초기화는 생성자에서
            this.servingSize = servingSize;
            this.servings = servings;
        }

        // 산텍 매개변수에 대한 Setter
        public Builder calories(int val) {
            calories = val;
            return this;
        }
        public Builder fat(int val) {
            fat = val;
            return this;
        }
        public Builder sodium(int val) {
            sodium = val;
            return this;
        }
        public Builder carbohydrate(int val) {
            carbohydrate = val;
            return this;
        }

        // NutritionFactsBuilder 생성자 호출
        public NutritionFactsBuilder build() {
            return new NutritionFactsBuilder(this);
        }
    }

    // Builder 를 매개변수로 넣는 생성자
    public NutritionFactsBuilder(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }

    public static void main(String[] args) {
        NutritionFactsBuilder nutritionFactsBuilder = new NutritionFactsBuilder.Builder(240, 9).calories(100).sodium(10).build();

        Builder builder = new Builder(240, 9);
        builder.calories(100);
        builder.sodium(10);
        NutritionFactsBuilder nutritionFactsBuilder1 = builder.build();
    }
}

 lombok.Builder

  • 빌더 패턴 적용을 위한 빌더를 자동으로 생성해준다.

 기본 사용법

  • 아래와 같이 @Builder만 붙여주면 모든 멤버 변수를 포함하는 생성자가 자동으로 생성된다. (이때는 @AllArgsConstructor와 쓰임이 비슷함)
@Builder
public class BuilderTest {
    private Long id;
    private String name;
    private String nickname;
}
public class Main {
    public static void main(String[] args) throws IllegalAccessException {
        // 기본 빌더
        BuilderTest builderTest = new BuilderTest(3L, "ee", "e");
    }
}

필수 생성자만 파라미터로 받기

  • 위에 코드처럼 길게 구현해야 했을 builder를 롬복이 자동으로 생성해준다.
@Builder
public class BuilderTest {
    private Long id;
    private String name;
    private String nickname;

    public static BuilderTestBuilder builderWithId(Long id) throws IllegalAccessException {
        if (id == null) {
            throw new IllegalAccessException("필수 파라미터 누락");
        }
        return builder().id(id);
    }
}
public class Main {
    public static void main(String[] args) throws IllegalAccessException {

        // 필수 값만 넣은 빌더
        BuilderTest builderTest1 = BuilderTest.builderWithId(12L)
                .name("이름 추가")
                .build();
    }
}
반응형