[개발팁]빌더 패턴 샘플 0 1 4,463

by 허용운 [JAVA 관련] 개발팁 java 자바 빌더 빌더패턴 Builder [2009.01.12 22:32:31]


지금 쓸려고 하는 예제는 객체를 생성하거나 죽일때 할떄 고려 하게 되는 여러가지 기술중
(싱글톤 , 스태틱 팩토리 메소등 등등 ) 하나이 빌더에 관한 내용입니다.

인터넷을 뒤지다 보면 Build 에 관한 예제들이 참으로 많습니다. 하지만 패턴으로 사용되는 Builder 의 경우
아무래도 그 사용 이유와 언저 어떻게 사용하는지 참으로 설계시 애로 사항이 꽃피는 경우가 많습니다.
그래서 빌더를 패턴에 여러 클래스 간에 패턴에 초점을 마춘경우와 단독으로 구현한 빌더를 샘플로 올리니
필요하신분은 참조 하셔서 사용 하시기 바랍니다.

단독으로 사용되는 빌더

1. 빌더를 쓰지 않은 경우

 public class NutritionFacts {

 private final int servingSize; // (mL) required
 private final int servings; // (per container) required
 private final int calories; // optional
 private final int fat; // (g) optional
 private final int sodium; // (mg) optional
 private final int carbohydrate; // (g) optional
 public NutritionFacts(int servingSize, int servings) {
 this(servingSize, servings, 0);
 }
 public NutritionFacts(int servingSize, int servings,
 int calories) {
 this(servingSize, servings, calories, 0);
 }
 public NutritionFacts(int servingSize, int servings,
 int calories, int fat) {
 this(servingSize, servings, calories, fat, 0);
 }
 public NutritionFacts(int servingSize, int servings,
 int calories, int fat, int sodium) {
 this(servingSize, servings, calories, fat, sodium, 0);
 }
 
 public NutritionFacts(int servingSize, int servings,
   int calories, int fat, int sodium, int carbohydrate) {
   this.servingSize = servingSize;
   this.servings = servings;
   this.calories = calories;
   this.fat = fat;
   this.sodium = sodium;
   this.carbohydrate = carbohydrate;
 }
}

1의 예제에서 보시면 제가 예전에  아주 자주 범하는 문제 중에 하나 였는데요.
생성자를 무지막지 하게 재활용 하다 보니.... 그 인자가 머가 들어가게 되는 나중에 도저히
주석 없이는 (주석이 있어도 가속도가 엄청 떨어졌습니다.) 너무 코딩하기 힘든 적이 있었습니다.

위의 코드를 빌더를 적용 하면 다음과 같이 쓸수 있겠네요.

// Builder Pattern
public class NutritionFacts {
 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 {
 // Required parameters
 private final int servingSize;
 private final int servings;
 // Optional parameters - initialized to default values
 private int calories = 0;
 private int fat = 0;
 private int carbohydrate = 0;
 private int sodium = 0;
 
public Builder(int servingSize, int servings) {
 this.servingSize = servingSize;
 this.servings = servings;
}

public Builder calories(int val) { calories = val; return this; }
public Builder fat(int val){ fat = val; return this; }
public Builder carbohydrate(int val){ carbohydrate = val; return this; }
public Builder sodium(int val){ sodium = val; return this; }
public NutritionFacts build() {return new NutritionFacts(this);}
}

private NutritionFacts(Builder builder) {
 servingSize = builder.servingSize;
 servings = builder.servings;
 calories = builder.calories;
 fat = builder.fat;
 sodium = builder.sodium;
 carbohydrate = builder.carbohydrate;
}
}

별다른건 없구요 innerClass 를 통해서 간단하게 빌더를 구현 했습니다.

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

요런식으로 생성하면 되는데 1의 방식과는 다르게 굉장히 직관적인 코드를 얻을수 있습니다.
즉 재활용하기에도 더 좋지용~
예제에서 느껴지는 거처럼 빌더는 엄청난 양의 파라메터 컨트롤이 필요한 생성자를 만들때
유용하게 쓰여 집니다.

여러 클래스 간의 관계시에 빌더 패턴의 샘플은 인터넷을 검색 하면 얼마 든지 얻을수 있으니
따로 쓰지는 않겠습니다.( 이글은 어디까지나 제가 나중에 참조 하기 위해 작성하는 중이니까요 ㅋㅋ)

by 꼬비 [2014.09.25 15:05:34]

좋은 정보네요~!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입