[Flutter๐Ÿ“ฑ] ํŒฉํ† ๋ฆฌ ํŒจํ„ด(factory pattern)

gou5metยท2021๋…„ 8์›” 24์ผ
1

Flutter๊ณต๋ถ€

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

์ด๊ฒŒ ๋ฌด์—‡์ธ๊ฐ€?๐Ÿ˜ถ

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์œ ๋‹ˆํ‹ฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ฐฐ์šด ๊ฐœ๋…์ธ๋ฐ ์ƒ์„ฑ์ž๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๊ฒฐ๊ตญ ์ดˆ๊ธฐ์— ๋งŒ๋“ค์–ด์ง„ ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
factory ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ ์“ฐ๋Š” ์˜ˆ์•ฝ์–ด ์ด๋‹ค.

์™œ ์‚ฌ์šฉํ• ๊นŒ?๐Ÿคจ

static์„ ์‚ฌ์šฉํ•œ ํšจ๊ณผ๊ฐ€ ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋‚ด๋ถ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ชจ๋ธ ์ƒ์„ฑ์„ ๊ด€์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
...? ๋ฌด์Šจ ์†Œ๋ฆฌ์ผ๊นŒ๐Ÿคทโ€โ™‚๏ธ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์‚ฌ์šฉ X
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();
    }
  }
} 

...

๊ทธ๋ ‡๋‹ค๋ฉด ๊ตณ์ด ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ? ์‚ฌ์‹ค ์ƒ๊ด€์—†๋‹ค.
ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ๋ถ€๋ถ„(์œ„ ์ฝ”๋“œ์—์„  ๋ฉ”์ธ ํ•จ์ˆ˜)์—์„œ ์ฐธ์กฐ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค. ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ•œ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ฐ„ ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์ด ์•„๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—์„œ ์ˆ˜์ •์ด ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด, ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ๊ณณ์—์„œ๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์จ์•ผ๋จ?๐Ÿ˜‘

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ... ๋ผ๊ณ  ํ•˜๊ธฐ๋ณด๋‹จ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š”๊ฑธ ์ถ”์ฒœ. ์ด ์˜์ƒ์˜ ๋‚ด์šฉ์„ ๋‘์„œ์—†์ด ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.

profile
ํ”Œ๋Ÿฌํ„ฐ ๊ณต๋ถ€ ์ค‘์— ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€