Builder Design Pattern

The Builder Design Pattern is a creational pattern used in software design to construct a complex object step by step. It allows the construction of a product in a step-by-step fashion, where the construction process can vary based on the type of product being built. The pattern separates the construction of a complex object from its representation, allowing the same construction process to create different representations.

Table of Contents

  1. Components
  2. Implementation

Components

Product

The Product is the complex object that the Builder pattern is responsible for constructing.

Computer

class Computer:
    cpu: str
    ram: str
    storage: str

    def __init__(self) -> None:
        self.cpu = ''
        self.ram = ''
        self.storage = ''

    def set_cpu(self, cpu: str) -> None:
        self.cpu = cpu

    def set_ram(self, ram: str) -> None:
        self.ram = ram

    def set_storage(self, storage: str) -> None:
        self.storage = storage

    def display_info(self) -> None:
        print("Computer configuration:")
        print(f"CPU: {self.cpu}")
        print(f"RAM: {self.ram}")
        print(f"Storage: {self.storage}")

Builder Implementation

from abc import ABC, abstractmethod

class Builder(ABC):
    @abstractmethod
    def build_cpu(self):
        pass

    @abstractmethod
    def build_ram(self):
        pass

    @abstractmethod
    def build_storage(self):
        pass

    @abstractmethod
    def get_result(self):
        pass

GamingComputerBuilder

from Builder import Builder
from Computer import Computer

class GamingComputerBuilder(Builder):

    computer: Computer = Computer()

    def build_cpu(self) -> None:
        self.computer.set_cpu('Intel Core i9-9900K')

    def build_ram(self) -> None:
        self.computer.set_ram('Corsair Vengeance LPX 16GB')

    def build_storage(self) -> None:
        self.computer.set_storage('Seagate Barracuda 2TB')

    def get_result(self) -> Computer:
        return self.computer

Director Implementation

from GamingComputerBuilder import GamingComputerBuilder
from Builder import Builder

class Director:
    def construct(self, builder: Builder) -> None:
        builder.build_cpu()
        builder.build_ram()
        builder.build_storage()

Client Implementation

from GamingComputerBuilder import GamingComputerBuilder
from OfficeComputerBuilder import OfficeComputerBuilder
from Director import Director
from Builder import Builder
from Computer import Computer

def main() -> None:
    gaming_computer_builder: Builder = GamingComputerBuilder()
    director = Director()

    director.construct(gaming_computer_builder)
    gaming_computer: Computer = gaming_computer_builder.get_result()

    gaming_computer.display_info()

    office_computer_builder: Builder = OfficeComputerBuilder()

    director.construct(office_computer_builder)
    office_computer: Computer = office_computer_builder.get_result()

    office_computer.display_info()


if __name__ == '__main__':
    main()