Laptop Factory | Builder Design Pattern | Feedback Welcomed
"""
Builder Pattern - Builder pattern is defined for building up object with specified abstract methods and providing autonomy to concreatebuilders as per their configs
"""

"""
Problem Statement - Factory for making Laptops of different brands with different specifications
"""

"""
Use Case Flow -
1. System is requested for a Laptop of a brand with specifications (in terms of prod code)
2. The Object for appropriate object should be created
"""

"""
System Requirement -
1. Request for different laptop brands
2. Each laptop brand can have different support for parts
"""

"""
Classes - 
1. DeviceBuilder - Interface
    params - 
    mouse (protected)
    keyboard (protected)
    screen (protected)
    methods - (abstract public)
    setMouse
    setKeyboard
    setScreen
    showSpecs
2. DellDeviceBuilder - implements DeviceBuilder
    methods - 
    setMouse
    setKeyboard
    setScreen
    showSpecs
3. HpDeviceBuilder - implements DeviceBuilder
    methods - 
    setMouse
    setKeyboard
    setScreen
    showSpecs
4. SystemDirector 
    methods - 
    buildDesktop (params -> DeviceBuilder) (return - Desktop)
"""

"""
Code Implementation
"""

from abc import ABC, abstractmethod
class DeviceBuilder(ABC):

    """
    Init @ DeviceBuilder
    """
    def __init__(self):
        self._mouse = None
        self._keyboard = None
        self._screen = None
    
    """
    Abstract Methods @ DeviceBuilder
    """

    @abstractmethod
    def setMouse(self, mouse):
        pass
    
    @abstractmethod
    def setKeyboard(self, keyboard):
        pass
    
    @abstractmethod
    def setScreen(self, screen):
        pass

    @abstractmethod
    def showSpecs(self):
        pass

class DellDeviceBuilder(DeviceBuilder):

    """
    Init @ DellDeviceBuilder
    """
    def __init__(self):
        super().__init__()
    
    def setMouse(self, mouse):
        self._mouse = mouse
    
    def setKeyboard(self, keyboard):
        self._keyboard = keyboard
    
    def setScreen(self, screen):
        self._screen = screen
    
    def showSpecs(self):
        print("DELL: PRODUCT")
        print("MONITOR: " + self._screen)
        print("KEYBOARD: " + self._keyboard)
        print("MOUSE: " + self._mouse)


class HpDeviceBuilder(DeviceBuilder):

    """
    Init @ HpDeviceBuilder
    """
    def __init__(self):
        super().__init__()
    
    def setMouse(self, mouse):
        self._mouse = mouse
    
    def setKeyboard(self, keyboard):
        self._keyboard = keyboard
    
    def setScreen(self, screen):
        self._screen = screen
    
    def showSpecs(self):
        print("HP: PRODUCT")
        print("MONITOR: " + self._screen)
        print("KEYBOARD: " + self._keyboard)
        print("MOUSE: " + self._mouse)

class SystemDirector:
    """
    Init @ SystemDirector
    """
    def __init__(self):
        self.brands = set()
        self.__deviceBuilder = None

    """
    Brands @ SystemDirector
    """
    def addBrand(self, newBrand):
        self.brands.add(newBrand)
    
    def removeBrand(self, brand):
        self.brands.remove(brand)
    
    """
    getDeviceBuilder (private) @ SystemDirector - responsible for solely getting appropriate device builder
    """
    def __getDeviceBuilder(self, brandCode):
        if(brandCode in self.brands):
            if(brandCode == "DELL"):
                return DellDeviceBuilder()
            elif(brandCode == "HP"):
                return HpDeviceBuilder()
            else:
                print("Builder not found")
                return None
        else:
            raise Exception("Unregistered brand")

    """
    BuildDesktop (public) @ SystemDirector - responsible for creating the desktop
    """
    def buildDesktop(self, brandCode, deviceCode):
        self.__deviceBuilder = self.__getDeviceBuilder(brandCode)
        # based on deviceCode we get mouse, keyboard, screen configs (pass deviceCode as param in set methods altogether) for now we use dummy values
        self.__deviceBuilder.setKeyboard(brandCode + " KEYBOARD 123")
        self.__deviceBuilder.setMouse(brandCode + "  KEYBOARD 123")
        self.__deviceBuilder.setScreen(brandCode + "  KEYBOARD 123")
        self.__deviceBuilder.showSpecs()

"""
Testing
"""

director = SystemDirector()
director.addBrand("DELL")
director.addBrand("HP")
director.buildDesktop("DELL", "1234")
director.buildDesktop("HP", "1234")
Comments (1)