DesignPattern - Factory(1)

Song_MinGyuΒ·2021λ…„ 8μ›” 16일
0

λ””μžμΈνŒ¨ν„΄

λͺ©λ‘ 보기
5/6
post-thumbnail

πŸ“— κ°€μž₯ 기본적인 Factory

⚠ Factoryλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ

예λ₯Ό λ“€μ–΄μ„œ λ§Œμ•½ ν”„λ Œμ°¨μ΄μ¦ˆ μŒμ‹μ μ„ μ˜€ν”ˆν•œλ‹€κ³  μƒκ°ν•΄λ³΄μž.
μ„œμšΈ 각 ꡬ λ§ˆλ‹€ ν•œ 지점씩... 강남점, 마포점, μš©μ‚°μ , μ˜λ“±ν¬μ .......
μƒλ‹Ήνžˆ λ§Žμ€ 지점이 생길 것이닀.

public class GangNam{
    //...
}
public class Mapo{
    //...
}
....

μ½”λ“œλ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄ μ΄λŸ°μ‹μœΌλ‘œ κ΅¬ν˜„μ΄ 될 것이닀. κ·Έλ ‡λ‹€λ©΄ 이제 주문을 λ°›μ•„ μŒμ‹μ„ λ§Œλ“œλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.
주문을 λ°›κ³ , μž¬λ£Œμ€€λΉ„λ₯Ό ν•˜κ³ , μš”λ¦¬λ₯Ό ν•˜κ³ , ν”Œλ ˆμ΄νŒ…μ„ ν•˜κ³ , μ„œλΉ™μ„ ν•œλ‹€κ³  μƒκ°ν•˜μž. 그리고 μŒμ‹μ€ μŠ€ν…Œμ΄ν¬, νŒŒμŠ€νƒ€ 일단 λ‘κ°€μ§€λ§Œ μƒκ°ν•œλ‹€.

...
public class GangNam {
    public Meal orderMeal(String order) {
        Meal meal;
        if (order.equals("steak")) {
            meal = new Steak();
        } else if(order.equals("pasta")) {
            meal = new Pasta();
        }
        meal.prepare();
        meal.cook();
        meal.plating();
        meal.serving();
        return Meal;
    }
}
public class Mapo {
    public Meal orderMeal(String order) {
        Meal meal;
        if (order.equals("steak")) {
            meal = new Steak();
        } else if(order.equals("pasta")) {
            meal = new Pasta();
        }
        meal.prepare();
        meal.cook();
        meal.plating();
        meal.serving();
        return Meal;
    }
}
...

이런 μ‹μœΌλ‘œ μ½”λ“œκ°€ μž‘μ„±μ΄ 될텐데, 두 ν΄λž˜μŠ€λŠ” 같은 μ½”λ“œ, SRP(단일 μ±…μž„ 원칙)
λ˜ν•œ μœ„λ°˜ν•˜κ³  μžˆλ‹€. 그리고 λ§Œμ•½ μŒμ‹μ μ—μ„œ μŠ€ν…Œμ΄ν¬, νŒŒμŠ€νƒ€ 그리고 또 λ‹€λ₯Έ μΆ”κ°€ μŒμ‹ 10가지λ₯Ό λ§Œλ“€μ—ˆλ‹€κ³  ν•œλ‹€.
κ·Έλ ‡λ‹€λ©΄ μ•„κΉŒ μœ„μ—μ„œ μ„œμšΈμ˜ 각 ꡬ에 지점이 μžˆλ‹€κ³  ν•˜λ‹ˆ 25개의 클래슀λ₯Ό λœ―μ–΄κ³ μ³μ•Όν•˜λŠ” 상황이닀.

λͺ°λ‘  ν•΄λ‹Ή λ°©μ‹μ˜ μ½”λ“œ μž‘μ„±μ΄ ν˜„μž¬ μ§„ν–‰ν•˜λŠ” νŒ€μ—μ„œ μ‚¬μš©ν•˜κ±°λ‚˜ λ‹€μˆ˜μ˜ μ‚¬λžŒλ“€μ΄ 보기 νŽΈν•˜λ‹€λ©΄ ν•΄λ‹Ή 방식을 μ‚¬μš©ν•˜μ§€λ§Œ
λŒ€λ‹€μˆ˜κ°€ ν•΄λ‹Ή μ½”λ“œλ₯Ό λ³Έλ‹€λ©΄ λΉ„νš¨μœ¨μ μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆμ„ 것이라고 말할 것이닀.

κ·Έλ ‡λ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄λ‹Ή ν΄λž˜μŠ€λ“€μ„ μˆ˜μ •ν•˜κΈ° 쉽고, 보기 μ’‹κ²Œ λ§Œλ“€ 수 μžˆμ„κΉŒ?
μˆ˜μ •μ΄ λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚˜λŠ” λΆ€λΆ„ 을 λ”°λ‘œ λΆ„λ¦¬ν•˜μ—¬ λ§Œλ“€λ©΄ λœλ‹€.

πŸ’» Factoryλ₯Ό μ΄μš©ν•œ κ΅¬ν˜„

public class MealFactory {
    public Meal createMeal(String order) {
        Meal meal = null;
        if (order.equals("steak")) {
            meal = new Steak();
        } else if (order.equals("pasta")) {
            meal = new Pasta();
        } else if (order.equals("risotto")) {
            meal = new Resotto();
        } else if (order.equals("coffee")) {
            meal = new Coffee();
        } else if (order.equals("wine")) {
            meal = new Wine();
        }
    }
}

public class GangNam {
    MealFactory mealFactory;
    public GangNam(MealFactory mealFactory) {
        this.mealFactory = mealFactory;
    }
    public Meal orderMeal(String order) {
        Meal meal = mealFactory.createMeal(order);
        meal.prepare();
        meal.cook();
        meal.plating();
        meal.serving();
    }
}

public class Mapo {
    MealFactory mealFactory;
    public Mapo(MealFactory mealFactory) {
        this.mealFactory = mealFactory;
    }
    public Meal orderMeal(String order) {
        Meal meal = mealFactory.createMeal(order);
        meal.prepare();
        meal.cook();
        meal.plating();
        meal.serving();
    }
}

μ΄λ ‡κ²Œ μˆ˜μ •μ„ ν•œλ‹€λ©΄, μŒμ‹μ„ μƒˆλ‘œ μΆ”κ°€ν•œλ‹€κ³  ν•  λ•Œ, MealFactory 클래슀만 μˆ˜μ •ν•˜λ©΄ λ‹€λ₯Έ 클래슀λ₯Ό
μˆ˜μ •ν•  ν•„μš” 없이 μŒμ‹μ„ μΆ”κ°€ν•˜κ±°λ‚˜, μ‚­μ œν•  수 있게 λœλ‹€. 그리고 각 지점듀은 μŒμ‹μ„ λ§Œλ“œλŠ” 행동 ν•˜λ‚˜λ§Œ μ±…μž„μ„
κ°€μ§€κ²Œ λœλ‹€.

πŸ”¨ 마무리

ν•΄λ‹Ή 방법은 κ°€μž₯ 기본적인 νŒ©ν† λ¦¬ 이용 λ°©λ²•μœΌλ‘œ, λ””μžμΈ νŒ¨ν„΄μ€‘ ν•˜λ‚˜λΌκ³  말할 수 λŠ” μ—†μ§€λ§Œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ”λ° μžˆμ–΄μ„œ 맀우 자주 μ‚¬μš©λ˜λŠ” 방법이고,
λ””μžμΈ νŒ¨ν„΄μ—μ„œ μ“°μ΄λŠ” νŒ©ν† λ¦¬ λ©”μ†Œλ“œ(Factory Method), 좔상 νŒ©ν† λ¦¬(Abstract Method)μ—μ„œ μ΄μš©λ˜λŠ” κ°€μž₯ 기본적인 방법이닀.

profile
Always try to Change and Keep this mind

0개의 λŒ“κΈ€