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