Skip to content

Commit 967edee

Browse files
Added builder pattern
1 parent 1012efa commit 967edee

File tree

1 file changed

+168
-0
lines changed

1 file changed

+168
-0
lines changed
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
"""
2+
Author: CHIRAG SHAH
3+
Created On: 26th July 2018
4+
"""
5+
6+
import inspect, sys
7+
import matplotlib.pyplot as plt
8+
from pathlib import Path, PureWindowsPath
9+
from abc import ABCMeta, abstractmethod
10+
11+
sys.path.append(str(Path(__file__).resolve().parent.parent))
12+
from utility import class_diagram, output_image
13+
14+
class Aircraft:
15+
"""
16+
Base initialisation object
17+
"""
18+
19+
mark = ''
20+
model = ''
21+
max_speed = 0
22+
takeoff_speed = 0
23+
passengers_count = 0
24+
fuel_capacity = 0
25+
26+
class AircraftBuilder(metaclass = ABCMeta):
27+
"""
28+
Abstract builder for creating aircraft
29+
"""
30+
31+
def __init__(self):
32+
self.aircraft = None
33+
34+
def create_aircraft(self):
35+
self.aircraft = Aircraft()
36+
37+
@abstractmethod
38+
def build_mark(self):
39+
pass
40+
41+
@abstractmethod
42+
def build_model(self):
43+
pass
44+
45+
@abstractmethod
46+
def build_max_speed(self):
47+
pass
48+
49+
@abstractmethod
50+
def build_takeoff_speed(self):
51+
pass
52+
53+
@abstractmethod
54+
def build_passengers_count(self):
55+
pass
56+
57+
@abstractmethod
58+
def build_fuel_capacity(self):
59+
pass
60+
61+
class Airbus380Builder(AircraftBuilder):
62+
"""
63+
Concrete aircraft builder used for constructing the attributes of aircraft by inheriting the abstract builder
64+
"""
65+
66+
def build_fuel_capacity(self):
67+
self.aircraft.fuel_capacity = 32000
68+
69+
def build_takeoff_speed(self):
70+
self.aircraft.takeoff_speed = 277.8
71+
72+
def build_max_speed(self):
73+
self.aircraft.max_speed = 1020
74+
75+
def build_passengers_count(self):
76+
self.aircraft.passengers_count = 538
77+
78+
def build_mark(self):
79+
self.aircraft.mark = 'Airbus'
80+
81+
def build_model(self):
82+
self.aircraft.model = 'A-380'
83+
84+
class Cessna172Builder(AircraftBuilder):
85+
"""
86+
Concrete aircraft builder used for constructing the attributes of aircraft by inheriting the abstract builder
87+
"""
88+
89+
def build_fuel_capacity(self):
90+
self.aircraft.fuel_capacity = 249.837
91+
92+
def build_takeoff_speed(self):
93+
self.aircraft.takeoff_speed = 277.8
94+
95+
def build_max_speed(self):
96+
self.aircraft.max_speed = 302
97+
98+
def build_passengers_count(self):
99+
self.aircraft.passengers_count = 1
100+
101+
def build_mark(self):
102+
self.aircraft.mark = 'Cessna'
103+
104+
def build_model(self):
105+
self.aircraft.model = '172'
106+
107+
class AircraftDirector:
108+
"""
109+
Constructs aircraft object using builder interface
110+
"""
111+
112+
def __init__(self):
113+
self._builder = None
114+
115+
def build(self, aircraft_builder):
116+
self._builder = aircraft_builder
117+
self._builder.build_fuel_capacity()
118+
self._builder.build_takeoff_speed()
119+
self._builder.build_max_speed()
120+
self._builder.build_passengers_count()
121+
self._builder.build_mark()
122+
self._builder.build_model()
123+
return self._builder.aircraft
124+
125+
def test_builder():
126+
"""
127+
Demonstration of builder pattern
128+
"""
129+
130+
def get_custom_fields_str(obj):
131+
return '\n'.join('{}: {}'.format(field, obj.__getattribute__(field)) for field in dir(obj) if not field.startswith('__'))
132+
133+
aircraft_builder = Airbus380Builder()
134+
aircraft_builder.create_aircraft()
135+
aircraft_director = AircraftDirector()
136+
aircraft = aircraft_director.build(aircraft_builder)
137+
print(get_custom_fields_str(aircraft))
138+
139+
def get_code():
140+
"""
141+
@return-values: source code
142+
"""
143+
a = inspect.getsource(Aircraft)
144+
b = inspect.getsource(AircraftBuilder)
145+
c = inspect.getsource(Airbus380Builder)
146+
d = inspect.getsource(Cessna172Builder)
147+
e = inspect.getsource(AircraftDirector)
148+
f = inspect.getsource(test_builder)
149+
150+
return a + '\n' + b + '\n' + c + '\n' + d + '\n' + e + '\n' + f
151+
152+
def get_classdiagram():
153+
"""
154+
@return-values: matplotlib object with class diagram
155+
"""
156+
157+
diagram = class_diagram("builder.png")
158+
plt.show()
159+
return diagram
160+
161+
def get_outputimage():
162+
"""
163+
@return-values: matplotlib object with code output
164+
"""
165+
166+
output = output_image("builder_aircraft.png")
167+
plt.show()
168+
return output

0 commit comments

Comments
 (0)