Wzorzec projektowy fabryka abstrakcyjna (ang. abstract factory) umożliwia stworzenie, za pomocą identycznych interfejsów fabryk, różnych obiektów w zależności od wyboru fabryki.

Przykładem użycia może być graficzny interfejs użytkownika. Abstrakcyjna fabryka będzie dostarczała interfejsy do stworzenie dowolnych kontrolek, ale docelowa implementacja fabryki pozwoli dopasować szczegóły poszczególnych elementów.

Wzorzec wprowadza pewne uogólnienie, które pozwala na łatwe przełączanie się pomiędzy różnymi implementacjami fabryk.

#include <iostream>

class CButton
{
public:
    virtual void action() = 0;
};

class CSimpleButton : public CButton
{
public:
    virtual void action()
    {
        std::cout << "CSimpleButton::action" << std::endl;
    }
};

class CGfxButton : public CButton
{
public:
    virtual void action()
    {
        std::cout << "CGfxButton::action" << std::endl;
    }
};

class CGUIFactory
{
public:
    virtual CButton* makeButton() = 0;
};

class CSimpleControls : public CGUIFactory
{
public:
    virtual CButton* makeButton()
    {
       return new CSimpleButton();
    }
};

class CGfxControls : public CGUIFactory
{
public:
    virtual CButton* makeButton()
    {
        return new CGfxButton();
    }
};

class CApplication
{
    CGUIFactory *factory;
    CButton *button;

public:
    CApplication(CGUIFactory *f) : factory(f), button(f->makeButton())
    {
    }

    void handle()
    {
        button->action();
    }

    ~CApplication()
    {
        delete button;
        delete factory;
    }
};

int main(int nArguments, char* szArguments[])
{
    CApplication app(new CGfxControls);
    //CApplication app(new CSimpleControls);
    app.handle();

    return 0;
}


0 Komentarzy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *