본문 바로가기
Design Pattern

[디자인 패턴] 빌더 패턴 (Builder Pattern)

by 노력남자 2020. 5. 11.
반응형

 

* 아래 3개의 패턴을 하나의 주제를 가지고 차례차례 설명합니다. 참고바랍니다.

 

점층적 생성자 패턴 (TelescopingConstructor Pattern)

자바빈즈 패턴 (JavaBeans Pattern)
빌더 패턴 (Builder Pattern)

 

빌더 패턴 (Builder Pattern) 이란?

필수 매개변수생성자를 통해 빌더 객체를 얻은 후 선택 매개변수세터 메서드들로 설정하고 build 메서드를 호출하는 점층적 생성자 패턴 안정성 + 자바빈즈 패턴 가독성을 겸비한 패턴

코드

public class NutritionFacts {

	private int servingSize; // 필수
	private int servings; // 필수
	private int calories;
	private int fat;
	private int sodium;
	private int carbohydrate;

	public static class Builder {
    
		// 필수 매개변수
		private int servingSize;
		private int servings;
        
		// 선택 매개변수
		private int calories     = 0;
		private int fat          = 0;
		private int sodium       = 0;
		private int carbohydrate = 0;

		private Builder(int servingSize, int servings) {
			this.servingSize = servingSize;
			this.servings = servings;
		}
        
		public Builder servingSize(int servingSize) {
			this.servingSize = servingSize;
			return this;
		}

		public Builder servings(int servings) {
			this.servings = servings;
			return this;
		}

		public Builder calories(int calories) {
			this.calories = calories;
			return this;
		}

		public Builder fat(int fat) {
			this.fat = fat;
			return this;
		}

		public Builder sodium(int sodium) {
			this.sodium = sodium;
			return this;
		}

		public Builder carbohydrate(int carbohydrate) {
			this.carbohydrate = carbohydrate;
			return this;
		}

		public NutritionFacts build() {
			NutritionFacts nutritionFacts = new NutritionFacts();
			nutritionFacts.fat = this.fat;
			nutritionFacts.sodium = this.sodium;
			nutritionFacts.servings = this.servings;
			nutritionFacts.carbohydrate = this.carbohydrate;
			nutritionFacts.servingSize = this.servingSize;
			nutritionFacts.calories = this.calories;
			return nutritionFacts;
		}
	}

}

 

호출 방법

NutritionFacts cocalCola = new NutritionFacts.Builder(240, 8)
											.calories(100)
											.sodium(35)
											.carbohydrate(27)
											.build();

 

특징

장점

 

1. 점층적 생성자 패턴보다 간결하고 자바빈즈 패턴보다 안전하다. 

2. 계층적으로 설계된 클래스와 함께 쓰기 좋다.

 

단점

 

1. 빌더 생성 비용이 크진 않지만 성능에 민감한 상황에서는 문제가 될 수 있다. (빌더 객체를 계속 만들어야 함으로)

2. 점층적 생성자 패턴보다는 코드가 장황해서 매개변수가 4개 이상은 되어야 값어치를 한다.

 

 

* 항상 빌더 패턴이 점층적 생성자 패턴, 자바빈즈 패턴보다 좋은 것은 아닙니다. 상황에 맞게 프로젝트 개발 컨벤션에 맞게 사용해주시면 되겠습니다.

 

읽어주셔서 감사합니다.

 

참고

  • Joshua Bloch, Effective Java 3/E, 인사이트, 2018
반응형

댓글