1
+ """
2
+ builder
3
+ - Builder is a creational design pattern that lets you construct complex objects step by step.
4
+ The pattern allows you to produce different types and representations of an object using the same
5
+ construction code.
6
+ """
7
+ import abc
8
+
9
+
10
+ class Car : # Product
11
+ def __init__ (self ):
12
+ self ._wheel = None
13
+ self ._engine = None
14
+ self ._body = None
15
+
16
+ def set_wheel (self , wheel ):
17
+ self ._wheel = wheel
18
+
19
+ def set_body (self , body ):
20
+ self ._body = body
21
+
22
+ def set_engine (self , engine ):
23
+ self ._engine = engine
24
+
25
+ def detail (self ):
26
+ print (f'Body: { self ._body .shape } ' )
27
+ print (f'Engine: { self ._engine .hp } ' )
28
+ print (f'Wheel: { self ._wheel .size } ' )
29
+
30
+
31
+ class AbstractBuilder (abc .ABC ): # Abstract Builder
32
+
33
+ @abc .abstractmethod
34
+ def get_engine (self ): pass
35
+
36
+ @abc .abstractmethod
37
+ def get_wheel (self ): pass
38
+
39
+ @abc .abstractmethod
40
+ def get_body (self ): pass
41
+
42
+
43
+ class Benz (AbstractBuilder ): # Concrete Builder 1
44
+ def get_body (self ):
45
+ body = Body ()
46
+ body .shape = 'Suv'
47
+ return body
48
+
49
+ def get_engine (self ):
50
+ engine = Engine ()
51
+ engine .hp = 500
52
+ return engine
53
+
54
+ def get_wheel (self ):
55
+ wheel = Wheel ()
56
+ wheel .size = 22
57
+ return wheel
58
+
59
+
60
+ class Bmw (AbstractBuilder ): # Concrete Builder 2
61
+ def get_body (self ):
62
+ body = Body ()
63
+ body .shape = 'Sedan'
64
+ return body
65
+
66
+ def get_engine (self ):
67
+ engine = Engine ()
68
+ engine .hp = 340
69
+ return engine
70
+
71
+ def get_wheel (self ):
72
+ wheel = Wheel ()
73
+ wheel .size = 20
74
+ return wheel
75
+
76
+
77
+ class Director :
78
+ _builder = None
79
+
80
+ def set_builder (self , builder ):
81
+ self ._builder = builder
82
+
83
+ def construct (self ):
84
+ car = Car ()
85
+
86
+ body = self ._builder .get_body ()
87
+ car .set_body (body )
88
+
89
+ wheel = self ._builder .get_wheel ()
90
+ car .set_wheel (wheel )
91
+
92
+ engine = self ._builder .get_engine ()
93
+ car .set_engine (engine )
94
+
95
+ return car
96
+
97
+
98
+ class Wheel : size = None
99
+ class Body : shape = None
100
+ class Engine : hp = None
101
+
102
+
103
+ def client_builder (builder ):
104
+ builders = {
105
+ 'bmw' : Bmw ,
106
+ 'benz' : Benz
107
+ }
108
+
109
+ car = builders [builder ]()
110
+ director = Director ()
111
+ director .set_builder (car )
112
+ result = director .construct ()
113
+ return result .detail ()
114
+ # example #
115
+
116
+ client_builder ('bmw' )
0 commit comments