As i wish

[Design pattern] Factory method pattern (팩토리 메소드 패턴) 본문

Design Pattern

[Design pattern] Factory method pattern (팩토리 메소드 패턴)

어면태 2019. 2. 10. 23:24

안녕하세요.

오늘은 팩토리 메서드 패턴 을 알아보겠습니다.


늘 그러하듯 정의부터 보시죠.


Factory method pattern

객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다.

즉 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것.



출처: https://jusungpark.tistory.com/14?category=630296 [정리정리정리]


쉽게 말해서 하위 클래스가 어떤 객체를 설정할지를 결정한다라고 보시면 될듯 하네요.


다른 포스팅과는 다르게 UML 다이어그램부터 보겠습니다.




제가 그린 UML 다이어그램에서 PizzaStore는 Creator

Pizza는 Product가 되죠.

이처럼 Pizzastore는 ChicagoPizza 또는 NYPizza store만 설정을 하고 이 각각의 서브 클래스들(ChicagoPizzaStore, NYPizzaStroe)이 

어떤 스타일에 Product를 설정할지 결정한다고 생각하시면 쉬울 듯 하네요.

역시나 코드로 보는게 훨씬 이해하기 편한것 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# -*- coding: utf-8 -*-
# FactoryMethod Pattern
 
import abc
 
class Pizzastore:
  __metaclass__ = abc.ABCMeta
 
  def orderPizza(self, type):
    pizza = self.createPizza(type)
 
    pizza.prepare()
    pizza.bake()
    pizza.cut()
    pizza.box()
 
    return pizza
 
  @abc.abstractmethod
  def createPizza(self, type):
    pass
 
class ChicagoPizzaStore(Pizzastore):
  def createPizza(self, type):
    pizza = None
 
    if type == 'CHEESE':
      pizza = ChicagoCheesePizza()
    elif type == 'PEPPERONI':
      pizza = ChicagoPepperoniPizza()
    else:
      pizza =ChicagoPizza()
 
    return pizza
 
class NYPizzaStore(Pizzastore):
  def createPizza(self, type):
    pizza = None
 
    if type == 'CHEESE':
      pizza = NYCheesePizza()
    elif type == 'PEPPERONI':
      pizza = NYPepperoniPizza()
    else:
      pizza = NYPizza()
 
    return pizza
 
class Pizza:
  __metaclass__ = abc.ABCMeta
 
  def prepare(self):
    print('Prepare %s' %self.name)
    print('Dough %s' %self.dough)
    print('Sauce %s' %self.sauce)
 
  def bake(self):
    print('Bake %s' %self.name)
 
  def cut(self):
    print('Cut %s' %self.name)
 
  def box(self):
    print('Boxing %s' %self.name)
 
class ChicagoPizza(Pizza):
  def __init__(self):
    self.name = 'Chicago Pizza'
    self.dough = 'None'
    self.sauce = 'None'
 
class ChicagoCheesePizza(Pizza):
  def __init__(self):
    self.name = 'Chicago Cheese Pizza'
    self.dough = 'Chicago Cheese'
    self.sauce = 'Chicago sauce'
 
class ChicagoPepperoniPizza(Pizza):
  def __init__(self):
    self.name = 'Chicago Pepperoni Pizza'
    self.dough = 'Chicago Pepperoni'
    self.sauce = 'Chicago sauce'
 
class NYPizza(Pizza):
  def __init__(self):
    self.name = 'NY Pizza'
    self.dough = 'None'
    self.sauce = 'None'
 
class NYCheesePizza(Pizza):
  def __init__(self):
    self.name = 'NY Pizza'
    self.dough = 'NY cheese'
    self.sauce = 'NY sauce'
 
class NYPepperoniPizza(Pizza):
  def __init__(self):
    self.name = 'NY Pizza'
    self.dough = 'NY pepperoni'
    self.sauce = 'NY sauce'
 
chicagoStore = ChicagoPizzaStore()
nyStore = NYPizzaStore()
 
nyStore.orderPizza('CHEESE')
print("###############")
chicagoStore.orderPizza('PEPPERONI')
print("############")
chicagoStore.orderPizza('CHEESE')
 
cs




Comments