μλ₯Ό λ€μ΄μ λ§μ½ νλ μ°¨μ΄μ¦ μμμ μ μ€ννλ€κ³ μκ°ν΄λ³΄μ.
μμΈ κ° κ΅¬ λ§λ€ ν μ§μ μ©... κ°λ¨μ , λ§ν¬μ , μ©μ°μ , μλ±ν¬μ .......
μλΉν λ§μ μ§μ μ΄ μκΈΈ κ²μ΄λ€.
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κ°μ ν΄λμ€λ₯Ό λ―μ΄κ³ μ³μΌνλ μν©μ΄λ€.
λͺ°λ‘ ν΄λΉ λ°©μμ μ½λ μμ±μ΄ νμ¬ μ§ννλ νμμ μ¬μ©νκ±°λ λ€μμ μ¬λλ€μ΄ 보기 νΈνλ€λ©΄ ν΄λΉ λ°©μμ μ¬μ©νμ§λ§
λλ€μκ° ν΄λΉ μ½λλ₯Ό λ³Έλ€λ©΄ λΉν¨μ¨μ μΌλ‘ μ½λλ₯Ό μμ±νμ κ²μ΄λΌκ³ λ§ν κ²μ΄λ€.
κ·Έλ λ€λ©΄ μ΄λ»κ² ν΄λΉ ν΄λμ€λ€μ μμ νκΈ° μ½κ³ , 보기 μ’κ² λ§λ€ μ μμκΉ?
μμ μ΄ λΉλ²νκ² μΌμ΄λλ λΆλΆ μ λ°λ‘ λΆλ¦¬νμ¬ λ§λ€λ©΄ λλ€.
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)μμ μ΄μ©λλ κ°μ₯ κΈ°λ³Έμ μΈ λ°©λ²μ΄λ€.