๋น๋ ํจํด(Builder pattern)
- ํด๋ผ์ด์ธํธ๋ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ง๋๋ ๋์ , ํ์ ๋งค๊ฐ๋ณ์๋ง์ผ๋ก ์์ฑ์(ํน์ ์ ์ ํฉํ ๋ฆฌ)๋ฅผ ํธ์ถํด ๋น๋ ๊ฐ์ฒด๋ฅผ ์ป๋๋ค.
- ๋น๋ ๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ ์ผ์ข ์ setter ๋ฉ์๋๋ค๋ก ์ํ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์๋ build ๋ฉ์๋๋ฅผ ํธ์ถํด ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ป๋๋ค.
๐ก ๋น๋๋ ์์ฑํ ํด๋์ค ์์ ์ ์ ๋ฉค๋ฒ ํด๋์ค๋ก ๋ง๋ค์ด๋๋ค.
๐ก ์ ์ธต์ ์์ฑ์ ํจํด๋ณด๋ค ์ฝ๋๊ฐ ์ฅํฉํ๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์๊ฐ 4๊ฐ ์ด์์ ๋์ด์ผ ์ธ๋งํจ.
package ๋น๋ํจํด;
public class NutritionFacts {
// ํ์ ์
๋ ฅ
private final int servingSize; // 1ํ ์ ๊ณต๋
private final int servings; // ์ด nํ ์ ๊ณต๋
// ์ ํ ์
๋ ฅ
private final int calories; // 1ํ ์ ๊ณต๋๋น
private final int fat; // ์ง๋ฐฉ
private final int carbohydrage; // ํ์ํ๋ฌผ
private final int protein; // ๋จ๋ฐฑ์ง
public static class Builder {
private final int servingSize;
private final int servings;
private int calories = 0;
private int fat = 0;
private int carbohydrage = 0;
private int protein = 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 carbohydrage(int val) {
carbohydrage = val;
return this;
}
public Builder protein(int val) {
protein = 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;
carbohydrage = builder.carbohydrage;
protein = builder.protein;
}
public void viewInfo() {
System.out.println("===== ์ฑ๋ถํ =====");
System.out.println("1ํ ์ ๊ณต๋ : " + servingSize + "ml");
System.out.println("์ด ์ ๊ณต๋ : " + servings + "ํ");
System.out.println("์นผ๋ก๋ฆฌ : " + calories + "kcal");
System.out.println("์ง๋ฐฉ : " + fat + "g");
System.out.println("ํ์ํ๋ฌผ : " + carbohydrage + "g");
System.out.println("๋จ๋ฐฑ์ง : " + protein + "g");
}
}
package ๋น๋ํจํด;
public class Main {
public static void main(String[] args) {
NutritionFacts n1 = new NutritionFacts.Builder(240, 8).calories(420)
.fat(35).carbohydrage(9).protein(2).build();
n1.viewInfo();
}
}
===== ์ฑ๋ถํ =====
1ํ ์ ๊ณต๋ : 240ml
์ด ์ ๊ณต๋ : 8ํ
์นผ๋ก๋ฆฌ : 420kcal
์ง๋ฐฉ : 35g
ํ์ํ๋ฌผ : 9g
๋จ๋ฐฑ์ง : 2g
- ๋น๋์ setter ๋ฉ์๋๋ค์ ๋น๋ ์์ ์ ๋ฐํ(this)ํ๊ธฐ ๋๋ฌธ์ ์ฐ์์ ์ผ๋ก ํธ์ถ ๊ฐ๋ฅ
(ํ๋ฃจ์ธํธ API, ๋ฉ์๋ ์ฐ์) - ๋ฉ์ธ์์ ๊ฐ์ฒด ์์ฑ์ ์์ฑํ๋ ์ฝ๋๋ ์ฐ๊ธฐ ์ฝ๊ณ , ์ฝ๊ธฐ ์ฝ๋ค.
์์ง ํด๋์ค ์์ ์ ์ ํด๋์ค๋ฅผ ๋ฃ์ด์ ํธ์ถํ๋ ๋ฐฉ์์ด ์ดํด๊ฐ 100% ๋์ง ์์์.. ์กฐ๊ธ ๋ ๊ณต๋ถํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค!
return this๊ฐ ๋ด๊ฐ ์๊ฐํ ์๋ฏธ๊ฐ ๋ง๋์ง๋ ํ์ธ ํด๋ณด๊ณ ์๋์ ์ถ๊ฐ ํด์ผ ํ ๊ฒ ๊ฐ๋ค.