[C++ / Design Pattern] 팩토리 패턴 #3
1. 팩토리 패턴이란?
Pizza
라는 클래스가 있다고 가정해봅시다.
1
2
3
4
class Pizza {
public:
};
하지만 피자가게에 가서 그냥 “피자 주세요.” 라고 하지는 않습니다.
“페퍼로니 피자 주세요.” 또는 “치즈 피자 주세요.” 와 같이 조금더 구체화된 피자를 말하죠.
이와 같이 피자는 “도우 위에 소스와 토핑 등을 올려 구운 음식”을 축약한 추상적 개념입니다.
따라서 Pizza
라는 클래스 또한 추상 클래스에 속한다고 분류할 수 있죠.
피자는 토핑을 올리고 굽는다.
라는 점을 기억하면, Pizza
라는 추상 클래스의 함수로는
placeTopping
과 bake
가 있어야겠네요.
1
2
3
4
5
6
class Pizza {
public:
virtual ~Pizza() = default;
virtual void placeTopping() = 0;
virtual void bake() = 0;
}
그렇다면 이제 조금더 구체화된 클래스를 만들어보겠습니다.
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
#include "pizza.h"
#include <iostream>
using namespace std;
class PepperoniPizza : public Pizza {
public:
void placeTopping() {
cout << "치즈를 올렸습니다.\n";
cout << "페퍼로니를 올렸습니다.\n";
}
void bake() {
cout << "피자를 섭씨 190도 15분간 구웠습니다.\n";
}
};
class CheesePizza : public Pizza {
public:
void placeTopping() {
cout << "치즈를 올렸습니다.\n";
}
void bake() {
cout << "피자를 섭씨 210도 13분간 구웠습니다.\n";
}
};
이제 피자를 주문하는 코드를 만들어 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <memory>
#include "other-pizza.cpp"
int main() {
string pizzaType = "cheese";
unique_ptr<Pizza> pizza;
if (pizzaType == "pepperoni") pizza = make_unique<PepperoniPizza>();
else if (pizzaType == "cheese") pizza = make_unique<CheesePizza>();
pizza->placeTopping();
pizza->bake();
}
{ file=”main.cpp” }
1
2
치즈를 올렸습니다.
피자를 섭씨 210도 13분간 구웠습니다.
지금 코드는 요청, 생성이 모두 한 코드에 모여 있습니다.
따라서 팩토리 디자인 패턴을 이용해서 생성 부분을 분리시켜 조금 더 코드를 구조적이게 만들 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
#include "other-pizza.h"
class SimplePizzaFactory {
public:
Pizza& createPizza(string pizzaType) {
unique_ptr<Pizza> pizza;
if (pizzaType == "pepperoni") pizza = make_unique<PepperoniPizza>();
else if (pizzaType == "cheese") pizza = make_unique<CheesePizza>();
else throw "Unknown pizza type";
pizza->placeTopping();
pizza->bake();
Pizza& pizzaRef = *pizza;
return pizzaRef;
}
};
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <memory>
#include <string>
#include "pizza-factory.h"
int main() {
string pizzaType = "cheese";
SimplePizzaFactory pizzaFactory;
Pizza& pizza = pizzaFactory.createPizza(pizzaType);
}
1
2
치즈를 올렸습니다.
피자를 섭씨 210도 13분간 구웠습니다.
다음과 같이 팩토리 디자인 패턴을 사용하면 프로그램을 조금 더 구조화 시킬 수 있습니다.
This post is licensed under
CC BY 4.0
by the author.