Skip to content

Commit 3eea688

Browse files
committed
builder
1 parent 30297aa commit 3eea688

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

creational/builder.py

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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

Comments
 (0)