forked from Rustam-Z/python-programming
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuilder.py
More file actions
87 lines (62 loc) Β· 2.11 KB
/
Copy pathbuilder.py
File metadata and controls
87 lines (62 loc) Β· 2.11 KB
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
"""
Separating class from building complex object.
Separating actual algorithm of creation of objects from actual object being created.
Builder constructs/initializes object.
Director knows how construct, concrete algorithm.
Director
.construct() -> open_file, parse_config, build_product, close_file
Builder
.open_file()
.parse_config()
.build_product()
.close_file()
ConcreteBuilder * concreteBuilder = new ConcreteBuilder();
Director * director = new Director(ConcreteBuilder);
director->construct("myAssets.zip");
Product * product = concreteBuilder.getProduct();
Isn't is wonderful! Wow!
https://github.com/faif/python-patterns/blob/master/patterns/creational/builder.py
https://youtu.be/VCxNt2K7aVY?t=527
"""
from typing import Type
class Car:
"""Product"""
def __init__(self):
self.model = None
self.tires = None
self.engine = None
def __str__(self):
return '{} | {} | {}'.format(self.model, self.tires, self.engine)
class Director:
"""Director"""
def __init__(self, builder):
self._builder = builder
def construct(self):
self._builder.create_new_car()
self._builder.add_model()
self._builder.add_tires()
self._builder.add_engine()
class Builder:
"""Abstract Builder"""
def __init__(self):
self.car = None
def create_new_car(self):
self.car = Car()
class SkyLarkBuilder(Builder):
"""Concrete Builder --> provides parts and tools to work on the parts"""
def add_model(self):
self.car.model = "Skylark"
def add_tires(self):
self.car.tires = "Regular tires"
def add_engine(self):
self.car.engine = "Turbo engine"
def get_car(self) -> Type[Car]:
"""Get object method should be inside Concrete Builder method.
Otherwise, we will lose all butty of Builder design pattern."""
return self.car
if __name__ == "__main__":
concrete_builder = SkyLarkBuilder()
director = Director(concrete_builder)
director.construct()
car = concrete_builder.get_car()
print(car) # Skylark | Regular tires | Turbo engine