Dezign Patterns

Abstract Factory Design Pattern

The Abstract Factory Pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes.



I - Interface

// Button interface
public interface Button {
    void paint();
}

// Checkbox interface
public interface Checkbox {
    void paint();
}

II- Concrete classes

// Windows Products
public class WindowsButton implements Button {
    public void paint() {
        System.out.println("Rendering a Windows Button");
    }
}

public class WindowsCheckbox implements Checkbox {
    public void paint() {
        System.out.println("Rendering a Windows Checkbox");
    }
}

// Mac Products
public class MacButton implements Button {
    public void paint() {
        System.out.println("Rendering a Mac Button");
    }
}

public class MacCheckbox implements Checkbox {
    public void paint() {
        System.out.println("Rendering a Mac Checkbox");
    }
}


III - AbstractFactory Interface

public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

IV - Concrete Factory

// Windows Factory
public class WindowsFactory implements GUIFactory {
    public Button createButton() {
        return new WindowsButton();
    }

    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}

// Mac Factory
public class MacFactory implements GUIFactory {
    public Button createButton() {
        return new MacButton();
    }

    public Checkbox createCheckbox() {
        return new MacCheckbox();
    }
}

V - Client Code

public class Application {
    private Button button;
    private Checkbox checkbox;

    public Application(GUIFactory factory) {
        button = factory.createButton();
        checkbox = factory.createCheckbox();
    }

    public void render() {
        button.paint();
        checkbox.paint();
    }
}

Advantages of Abstract Factory Pattern

  • Ensures consistency among related products.
  • Enforces a design where families of related objects are used together.
  • Hides creation logic, keeping client code clean.

Disadvantages of Abstract Factory Pattern

  • Can lead to a large number of classes.
  • Adding a new product type (e.g., Slider) requires changes in all factories and interfaces.