Selecting a family by name

Step 5 -- Selecting a family by name

Finally, let callers choose a theme by name at runtime -- for example from a config file or a user setting. Build a small registry.

Implement get_factory(name) that:

  • returns a LightFactory instance for the name light
  • returns a DarkFactory instance for the name dark
  • raises ValueError for any other name

Combined with build_ui from Step 4, a single string now drives the creation of an entire matching product family.

Hints
Starter code
class Button:
    """Abstract product: a clickable button."""
    def render(self):
        raise NotImplementedError

class Checkbox:
    """Abstract product: a toggle checkbox."""
    def render(self):
        raise NotImplementedError

class LightButton(Button):
    def render(self):
        return "[Light Button]"

class LightCheckbox(Checkbox):
    def render(self):
        return "[Light Checkbox]"

class DarkButton(Button):
    def render(self):
        return "[Dark Button]"

class DarkCheckbox(Checkbox):
    def render(self):
        return "[Dark Checkbox]"

class LightFactory:
    def create_button(self):
        return LightButton()

    def create_checkbox(self):
        return LightCheckbox()

class DarkFactory:
    def create_button(self):
        return DarkButton()

    def create_checkbox(self):
        return DarkCheckbox()

def build_ui(factory):
    button = factory.create_button()
    checkbox = factory.create_checkbox()
    return (button.render(), checkbox.render())

def get_factory(name):
    # TODO: map "light" -> LightFactory() and "dark" -> DarkFactory().
    # Raise ValueError for any unknown name.
    pass
Write it on a laptop

The editor and the test runner need a wide screen. Open this page on a desktop browser and your progress will be waiting.