The before code shows a constructor with optional parameters, which can get confusing with many options. The after code uses a Builder class to set parts step-by-step, making construction clear and flexible.
### Before (without Builder pattern):
class House:
def __init__(self, windows=None, doors=None, roof=None):
self.windows = windows
self.doors = doors
self.roof = roof
# Creating a house with many optional parts
house = House(windows=4, doors=2)
### After (with Builder pattern):
class House:
def __init__(self):
self.windows = 0
self.doors = 0
self.roof = None
class HouseBuilder:
def __init__(self):
self.house = House()
def add_windows(self, count):
self.house.windows = count
return self
def add_doors(self, count):
self.house.doors = count
return self
def add_roof(self, style):
self.house.roof = style
return self
def build(self):
return self.house
# Using builder to create a house step-by-step
builder = HouseBuilder()
house = builder.add_windows(4).add_doors(2).add_roof('Gable').build()