Skip to content

Instantly share code, notes, and snippets.

@ferdef
Created January 26, 2018 15:52
Show Gist options
  • Save ferdef/1f185322e0d0f41309d1db2c613246df to your computer and use it in GitHub Desktop.
Save ferdef/1f185322e0d0f41309d1db2c613246df to your computer and use it in GitHub Desktop.
Builder Pattern in Python
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