-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfactory_pattern.cpp
More file actions
203 lines (171 loc) · 4.51 KB
/
factory_pattern.cpp
File metadata and controls
203 lines (171 loc) · 4.51 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/**
* Pattern: Factory
*
* Short Story:
* A pizza brand wants to give franchise service.
* They have a contract and pizza store structure.
* They provide an orderPizza method and an abstract createPizza method.
* createPizza is abstract because they want some customized pizzas according to local aspects.
*
* */
#include <iostream>
#include <string>
#include <memory>
/// Pizza interface
class Pizza
{
protected:
std::string _name;
std::string _dough;
std::string _sauce;
public:
Pizza()=default;
virtual ~Pizza()=default;
virtual void prepare()
{
std::cout << "Prepare " << _name << std::endl;
std::cout << "Tossing dough...";
std::cout << "Adding sauce...";
}
virtual void bake()
{
std::cout << "Bake for 25 minutes at 350" << std::endl;
}
virtual void cut()
{
std::cout << "Cut the pizza into diagonal slices" << std::endl;
}
virtual void box()
{
std::cout << "Place pizza in official PizzaStore box" << std::endl;
}
std::string getName()
{
return _name;
}
friend std::ostream &operator<<(std::ostream &os, const Pizza &other);
};
std::ostream &operator<<(std::ostream &os, const Pizza &pizza)
{
os << "---- " << pizza._name <<" ----" << std::endl;
os << pizza._dough << std::endl;
os << pizza._sauce << std::endl;
return os;
}
/// Pizza implementations
class NYStyleCheesePizza : public Pizza
{
public:
NYStyleCheesePizza()
{
_name = "NY Style Sauce and Cheese Pizza";
_dough = "Thin Crust Dough";
_sauce = "Marinara Sauce";
}
};
class NYStylePepperoniPizza : public Pizza
{
public:
NYStylePepperoniPizza()
{
_name = "NY Style Pepperoni Pizza";
_dough = "Thin Crust Dough";
_sauce = "Marinara Sauce";
}
};
class ChicagoStyleCheesePizza : public Pizza
{
public:
ChicagoStyleCheesePizza()
{
_name = "Chicago Style Deep Dish Cheese Pizza";
_dough = "Extra Thick Crust Dough";
_sauce = "Plum Tomato Sauce";
}
void cut() override
{
std::cout << "Cutting the pizza into square slices" << std::endl;
}
};
class ChicagoStylePepperoniPizza : public Pizza
{
public:
ChicagoStylePepperoniPizza()
{
_name = "Chicago Style Pepperoni Pizza";
_dough = "Extra Thick Crust Dough";
_sauce = "Plum Tomato Sauce";
}
void cut() override
{
std::cout << "Cutting the pizza into square slices" << std::endl;
}
};
/// Pizza Store interface
class PizzaStore
{
public:
virtual Pizza* createPizza(std::string item)=0;
Pizza* orderPizza(std::string type)
{
/// Creating pizza may change over time so separate and encapsulate it.
Pizza* pizza = createPizza(type);
std::cout << "--- Making a " << pizza->getName() << " ---" << std::endl;
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
return pizza;
}
};
/// Pizza Store implementations
class NYPizzaStore : public PizzaStore
{
public:
Pizza* createPizza(std::string item)
{
if(item == "cheese")
{
return new NYStyleCheesePizza();
}
else if(item == "pepperoni")
{
return new NYStylePepperoniPizza();
}
else
{
return nullptr;
}
}
};
class ChicagoPizzaStore : public PizzaStore
{
public:
Pizza* createPizza(std::string item)
{
if(item == "cheese")
{
return new ChicagoStyleCheesePizza();
}
else if(item == "pepperoni")
{
return new ChicagoStylePepperoniPizza();
}
else
{
return nullptr;
}
}
};
int main()
{
std::unique_ptr<PizzaStore> nyStore(new NYPizzaStore());
std::unique_ptr<PizzaStore> chicagoStore(new ChicagoPizzaStore());
std::unique_ptr<Pizza> pizza1(nyStore->orderPizza("cheese"));
std::cout << "Baris ordered a " << pizza1->getName() << std::endl;
std::unique_ptr<Pizza> pizza2(chicagoStore->orderPizza("pepperoni"));
std::cout << "Kemal ordered a " << pizza2->getName() << std::endl;
std::unique_ptr<Pizza> pizza3(nyStore->orderPizza("pepperoni"));
std::cout << "Ali ordered a " << pizza3->getName() << std::endl;
return 0;
}