ํฉํ ๋ฆฌ ํจํด์ ์ฑ๊ธํค ํจํด์ด๋ค. ์ฑ๊ธํค ํจํด์ ์ ๋ํฐ๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ฐฐ์ด ๊ฐ๋
์ธ๋ฐ ์์ฑ์๋ฅผ ์ฌ๋ฌ๋ฒ ํธ์ถํด๋ ๊ฒฐ๊ตญ ์ด๊ธฐ์ ๋ง๋ค์ด์ง ํ๋์ ์์ฑ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
factory
๋ ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ ๋ ์ฐ๋ ์์ฝ์ด ์ด๋ค.
static์ ์ฌ์ฉํ ํจ๊ณผ๊ฐ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ด ํจํด์ ์ฌ์ฉํ ์ ์๊ณ , ๋ด๋ถ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ชจ๋ธ ์์ฑ์ ๊ด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ ์ ์ต์ํ ํ ์ ์๋ค.
...? ๋ฌด์จ ์๋ฆฌ์ผ๊น๐คทโโ๏ธ ์์ ๋ฅผ ํตํด ์์๋ณด์.
void main() {
var selectedPizza = PizzaType.Cheese;
Pizza pizza;
switch(selectedPizza) {
case PizzaType.Pineapple:
pizza = PineapplePizza();
break;
case PizzaType.Mushroom:
pizza = MushroomPizza();
break;
case PizzaType.Cheese:
pizza = CheesePizza();
break;
}
print(pizza.getPrice());
}
enum PizzaType(Pineapple, Mushroom, Cheese);
abstract class Pizza {
double getPrize();
}
class PineapplePizza implemants Pizza{
double prize = 20.0;
double getPrize() {
return prize;
}
}
class Mushroom implemants Pizza{
double prize = 10.0;
double getPrize() {
return prize;
}
}
class Cheese implemants Pizza{
double prize = 15.0;
double getPrize() {
return prize;
}
}
void main() {
Map<String, dynamic> json = {
"type":PizzaType.Pineapple,
};
print(Pizza.pizzaFactory(PizzaType.Pineapple).getPrice());
}
...
abstract class Pizza {
double getPrize();
factory Pizza.fromJson(Map<String, dynamic> json) {
switch(json["type"] as PizzaType) {
case PizzaType.Pineapple:
return PineapplePizza();
case PizzaType.Mushroom:
return MushroomPizza();
case PizzaType.Cheese:
return CheesePizza();
}
}
}
...
๊ทธ๋ ๋ค๋ฉด ๊ตณ์ด ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํด์ผํ ๊น? ์ฌ์ค ์๊ด์๋ค.
ํ์ง๋ง ํด๋ผ์ด์ธํธ ๋ถ๋ถ(์ ์ฝ๋์์ ๋ฉ์ธ ํจ์)์์ ์ฐธ์กฐ๋ฅผ ํ์ง ์๋๋ค๋ ์ ์ด ์๋ค. ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํ์ง ์์ ์ํ์์ ํ ํด๋์ค๋ฅผ ์์ ํ๋ค๋ฉด ์ฐธ์กฐํ๋ ๋ชจ๋ ํด๋์ค์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ์ฌ๊ฐ ๋ฒ๊ฑฐ๋ก์ด ์์
์ด ์๋๋ค.
ํ์ง๋ง ํฉํ ๋ฆฌ ํจํด์์ ์์ ์ด ์ด๋ฃจ์ด์ง๋ค๋ฉด, ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํ ๊ณณ์์๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
ํฉํ ๋ฆฌ ํจํด์ ์ฌ์ฉํ๋ ์ด์ ๋ ํธํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด์... ๋ผ๊ณ ํ๊ธฐ๋ณด๋จ, ์์์น ๋ชปํ ์ํฉ์ ์ ์ฐํ๊ฒ ๋์ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.
ํฉํ ๋ฆฌ ํจํด์ ๋ํด ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด ์ด ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํ๋๊ฑธ ์ถ์ฒ. ์ด ์์์ ๋ด์ฉ์ ๋์์์ด ์ ๋ฆฌํ ๊ฒ์ด๋ค.