Abstract Factory Pattern

public interface Button {
    void paint();
}
public class MacOSButton implements Button {
    @Override
    public void paint() {
        System.out.println("You have created MacOSButton.");
    }
}
public class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("You have created WindowsButton.");
    }
}
 
 
public interface Checkbox {
    void paint();
}
public class MacOSCheckbox implements Checkbox {
    @Override
    public void paint() {
        System.out.println("You have created MacOSCheckbox.");
    }
}
public class WindowsCheckbox implements Checkbox {
    @Override
    public void paint() {
        System.out.println("You have created WindowsCheckbox.");
    }
}
  • Factories
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}
public class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }
    @Override
    public Checkbox createCheckbox() {
        return new MacOSCheckbox();
    }
}
public class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
    @Override
    public Checkbox createCheckbox() {
        return new WindowsCheckbox();
    }
}
  • Driver
    • Note: Application class is not implemented to make it simple, not sure if it is important
public class Demo {
    private static GUIFactory factory;
 
    public static void main(String[] args) {
        if (System.getProperty("os.name").equals("Windows 10")) {
            factory = new WindowsFactory();
        } else {
            factory = new MacOSFactory();
        }
    }
}

UML

Abstract_Factory_UML