GiantStepDEV

๋นŒ๋” ํŒจํ„ด(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๊ฐ€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์˜๋ฏธ๊ฐ€ ๋งž๋Š”์ง€๋„ ํ™•์ธ ํ•ด๋ณด๊ณ  ์•„๋ž˜์— ์ถ”๊ฐ€ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. 
profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!