π Study/Design Pattern
[Effective JAVA] λΉλ ν¨ν΄ - μμ±μμ λ§€κ°λ³μκ° λ§μ κ²½μ° μΆμ²
kongmi
2023. 2. 12. 19:38
λΉλ ν¨ν΄(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κ° λ΄κ° μκ°ν μλ―Έκ° λ§λμ§λ νμΈ ν΄λ³΄κ³ μλμ μΆκ° ν΄μΌ ν κ² κ°λ€.