-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuilder_pattern.py
142 lines (101 loc) · 3.43 KB
/
builder_pattern.py
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
from abc import ABC, abstractmethod
import copy
class HousePlan(ABC):
@abstractmethod
def set_basement(self, basement: str) -> None:
pass
@abstractmethod
def set_structure(self, structure: str) -> None:
pass
@abstractmethod
def set_roof(self, roof: str) -> None:
pass
@abstractmethod
def set_interior(self, interior: str) -> None:
pass
class House(HousePlan):
def __init__(self):
self._basement: str = ''
self._structure: str = ''
self._roof: str = ''
self._interior: str = ''
def set_basement(self, basement: str) -> None:
self._basement = basement
def set_structure(self, structure: str) -> None:
self._structure = structure
def set_roof(self, roof: str) -> None:
self._roof = roof
def set_interior(self, interior: str) -> None:
self._interior = interior
def __str__(self) -> str:
return f"House: {self._basement} | {self._structure} | {self._roof} | {self._interior}"
class HouseBuilder(ABC):
@abstractmethod
def build_basement(self) -> None:
pass
@abstractmethod
def build_structure(self) -> None:
pass
@abstractmethod
def build_roof(self) -> None:
pass
@abstractmethod
def build_interior(self) -> None:
pass
@abstractmethod
def get_house(self) -> House:
pass
class IglooHouseBuilder(HouseBuilder):
def __init__(self):
self._house: House = House()
def build_basement(self) -> None:
self._house.set_basement("Ice bars")
def build_structure(self) -> None:
self._house.set_structure("Ice blocks")
def build_roof(self) -> None:
self._house.set_roof("Ice carvings")
def build_interior(self) -> None:
self._house.set_interior("Ice dome")
def get_house(self) -> House:
return self._house
class TipiHouseBuilder(HouseBuilder):
def __init__(self):
self._house: House = House()
def build_basement(self) -> None:
self._house.set_basement("Wooden poles")
def build_structure(self) -> None:
self._house.set_structure("Wood and ice")
def build_roof(self) -> None:
self._house.set_roof("Fire wood")
def build_interior(self) -> None:
self._house.set_interior("Wood, caribou and seal skins")
def get_house(self) -> House:
return self._house
class CivilEngineer:
def __init__(self, house_builder: HouseBuilder):
self._house_builder: HouseBuilder = house_builder
self.hi = ""
def get_house(self) -> House:
return self._house_builder.get_house()
def construct_house(self) -> None:
self._house_builder.build_basement()
self._house_builder.build_structure()
self._house_builder.build_roof()
self._house_builder.build_interior()
def set_builder(self, builder: HouseBuilder):
self._house_builder = builder
if __name__ == '__main__':
igloo_house_builder = IglooHouseBuilder()
civil_engineer = CivilEngineer(igloo_house_builder)
civil_engineer.construct_house()
house = civil_engineer.get_house()
print(house)
print(id(house))
house2 = igloo_house_builder.get_house()
print(id(house2))
tipi_house_builder = TipiHouseBuilder()
civil_engineer.set_builder(tipi_house_builder)
civil_engineer.construct_house()
house = civil_engineer.get_house()
print(house)
print(id(house))