DP: Abstract Factory

Abstract Factory provides an interface to create families of related objects without specifying their concrete classes. It is useful when systems must support multiple platforms or hardware families.

Example: creating UI widgets for Windows vs Linux, or drivers for different chipsets.

  • Ensures compatible object families
  • Enables platform independence

C Example (Factory function)

Using pointer to function

c
#include <stdio.h>

typedef struct {
    void (*drawButton)();
} GUIFactory;

void winButton() { printf("Windows Button\n"); }
void linuxButton() { printf("Linux Button\n"); }

GUIFactory createWindowsFactory() {
    GUIFactory f = { winButton };
    return f;
}

GUIFactory createLinuxFactory() {
    GUIFactory f = { linuxButton };
    return f;
}

int main() {
    GUIFactory gui = createLinuxFactory();
    gui.drawButton();
}

C++ Example

Using function override

cpp
#include <iostream>
using namespace std;

class Button {
public:
    virtual void draw() = 0;
};

class WinButton : public Button {
public:
    void draw() override { cout << "Windows Button\n"; }
};

class LinuxButton : public Button {
public:
    void draw() override { cout << "Linux Button\n"; }
};

class GUIFactory {
public:
    virtual Button* createButton() = 0;
};

class WinFactory : public GUIFactory {
public:
    Button* createButton() override { return new WinButton(); }
};

class LinuxFactory : public GUIFactory {
public:
    Button* createButton() override { return new LinuxButton(); }
};

int main() {
    GUIFactory* factory = new LinuxFactory();
    Button* btn = factory->createButton();
    btn->draw();
}