Created
January 26, 2018 15:52
-
-
Save ferdef/1f185322e0d0f41309d1db2c613246df to your computer and use it in GitHub Desktop.
Builder Pattern in Python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class VehicleDirector: | |
__builder = None | |
def set_builder(self, builder): | |
self.__builder = builder | |
def build(self): | |
vehicle = Vehicle() | |
vehicle.set_body(self.__builder.get_body()) | |
vehicle.set_engine(self.__builder.get_engine()) | |
for tires in range(self.__builder.get_tires_number()): | |
vehicle.attach_wheel(self.__builder.get_wheel()) | |
return vehicle | |
class Vehicle: | |
def __init__(self): | |
self.__wheels = list() | |
self.__engine = None | |
self.__body = None | |
def set_body(self, body): self.__body = body | |
def set_engine(self, engine): self.__engine = engine | |
def attach_wheel(self, wheel): self.__wheels.append(wheel) | |
def specifications(self): | |
print('Body: {}'.format(self.__body.shape)) | |
print('Engine HorsePower: {}'.format(self.__engine.horsepower)) | |
print('Tires:') | |
print('\tNumber: {}'.format(len(self.__wheels))) | |
print('\tSize: {}'.format(self.__wheels[0].size)) | |
class Builder: | |
def get_body(self): raise(NotImplementedError) | |
def get_engine(self): raise(NotImplementedError) | |
def get_wheel(self): raise(NotImplementedError) | |
def get_tires_number(self): return 0 | |
class BMWBuilder(Builder): | |
def get_body(self): return Body(shape='compact executive') | |
def get_engine(self): return Engine(horsepower=400) | |
def get_wheel(self): return Wheel(size=22) | |
def get_tires_number(self): return 4 | |
class MotorcycleBuilder(Builder): | |
def get_body(self): return Body(shape='sport') | |
def get_engine(self): return Engine(horsepower=250) | |
def get_wheel(self): return Wheel(size=18) | |
def get_tires_number(self): return 2 | |
class Engine: | |
def __init__(self, horsepower): self.horsepower = horsepower | |
class Wheel: | |
def __init__(self, size): self.size = size | |
class Body: | |
def __init__(self, shape): self.shape = shape | |
bmw_builder = BMWBuilder() | |
bike_builder = MotorcycleBuilder() | |
director = VehicleDirector() | |
print('BMW') | |
director.set_builder(bmw_builder) | |
bmw = director.build() | |
bmw.specifications() | |
print('Bike') | |
director.set_builder(bike_builder) | |
bike = director.build() | |
bike.specifications() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment