forked from gil9red/SimplePyScripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.py
More file actions
109 lines (74 loc) · 2.37 KB
/
Copy pathexample.py
File metadata and controls
109 lines (74 loc) · 2.37 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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'ipetrash'
# SOURCE: Design Patterns: Builder — Строитель
# SOURCE: https://ru.wikipedia.org/wiki/Строитель_(шаблон_проектирования)
from abc import ABC, abstractmethod
# "Product"
class Pizza:
def __init__(self):
self._dough = ""
self._sauce = ""
self._topping = ""
def set_dough(self, dough: str):
self._dough = dough
def set_sauce(self, sauce: str):
self._sauce = sauce
def set_topping(self, topping: str):
self._topping = topping
def __str__(self):
return f'Pizza(dough="{self._dough}, sauce="{self._sauce}, topping="{self._topping}")'
# "Abstract Builder"
class PizzaBuilder(ABC):
def __init__(self):
self._pizza = None
def get_pizza(self) -> Pizza:
return self._pizza
def create_new_pizza_product(self):
self._pizza = Pizza()
@abstractmethod
def build_dough(self):
pass
@abstractmethod
def build_sauce(self):
pass
@abstractmethod
def build_topping(self):
pass
# "ConcreteBuilder"
class HawaiianPizzaBuilder(PizzaBuilder):
def build_dough(self):
self._pizza.set_dough("cross")
def build_sauce(self):
self._pizza.set_sauce("mild")
def build_topping(self):
self._pizza.set_topping("ham+pineapple")
# "ConcreteBuilder"
class SpicyPizzaBuilder(PizzaBuilder):
def build_dough(self):
self._pizza.set_dough("pan baked")
def build_sauce(self):
self._pizza.set_sauce("hot")
def build_topping(self):
self._pizza.set_topping("pepperoni+salami")
# "Director"
class Waiter:
def __init__(self):
self.pizza_builder = None
def set_pizza_builder(self, pb: PizzaBuilder):
self.pizza_builder = pb
def get_pizza(self) -> Pizza:
return self.pizza_builder.get_pizza()
def construct_pizza(self):
self.pizza_builder.create_new_pizza_product()
self.pizza_builder.build_dough()
self.pizza_builder.build_sauce()
self.pizza_builder.build_topping()
if __name__ == '__main__':
# A customer ordering a pizza.
hawaiianPizzaBuilder = HawaiianPizzaBuilder()
waiter = Waiter()
waiter.set_pizza_builder(hawaiianPizzaBuilder)
waiter.construct_pizza()
pizza = waiter.get_pizza()
print(pizza)