Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Wzorce projektowe

metoda wytwórcza

[wzorzec projektowy] Dostarcza interfejs do tworzenia obiektów, gwarantując jednocześnie możliwość zmiany obiektów jakie będą tworzone przez wzorzec w klasach potomnych.

Budowa wzorca projektowego

C/C++
// -----------------------
// ----   STRUKTURA   ----
// -----------------------

class TProduct
{
public:
    //INFO: dowolny interfejs produktu, np. z domyślną implementacją
    virtual void Open( const char * sFileName ) { };
    virtual ~TProduct() { }
};

enum ProductTypeE { E_UNKNOWN, E_PRODUCT_1, E_PRODUCT_2, E_PRODUCT_3 }; //INFO: produkty, jeżeli stosujemy metodę wytwórczą nr 2

class TCreator
{
public:
    //INFO: dowolne operacje na obiekcie, np.
    TProduct * OpenDocumenct( const char * sFileName )
    {
        TProduct * pProduct = CreateProduct();
        if( !pProduct )
             return NULL;
       
        pProduct->Open( sFileName );
        return pProduct;
    }
   
    TProduct * OpenDocumenct( const char * sFileName, ProductTypeE eProductType )
    {
        TProduct * pProduct = CreateProduct( eProductType );
        if( !pProduct )
             return NULL;
       
        pProduct->Open( sFileName );
        return pProduct;
    }
   
protected:
    virtual TProduct * CreateProduct() = 0; //INFO: metoda wytwórcza (wersja 1)
    virtual TProduct * CreateProduct( ProductTypeE eProductType ) = 0; //INFO: metoda wytwórcza (wersja 2)
};

// -----------------------
// ---- IMPLEMENTACJA ----
// -----------------------

class CMyProduct1
    : public TProduct
{
    //INFO: jakaś implementacja produktu
};

class CMyProduct2
    : public TProduct
{
    //INFO: jakaś implementacja produktu
};

class CMyProduct3
    : public TProduct
{
    //INFO: jakaś implementacja produktu
};

class CMyCreator
    : public TCreator
{
protected:
    //INFO: jakaś implementacja tworzenia produktów
    virtual TProduct * CreateProduct()
    {
        return new CMyProduct1;
    }
   
    virtual TProduct * CreateProduct( ProductTypeE eProductType )
    {
        switch( eProductType )
        {
        case E_PRODUCT_1:
            return new CMyProduct1;
        case E_PRODUCT_2:
            return new CMyProduct2;
        case E_PRODUCT_3:
            return new CMyProduct3;
        default:
            return NULL;
        } //switch
    }
   
};

Opis szczegółowy

Metoda wytwórcza (ang. factory method) - wzorzec projektowy, który dostarcza interfejs do tworzenia obiektów, gwarantując jednocześnie możliwość zmiany obiektów jakie będą tworzone przez wzorzec w klasach potomnych.

Zastosowanie

Niniejszy wzorzec projektowy stosuje się gdy:
  • klasa potomna ma decydować jaki obiekt ma zostać stworzony przez klasę bazową;
  • nie da się określić jakie obiekty powinny być tworzone przez klasę bazową;
  • chcemy ukryć implementację » Dokumentacjaframeworka przed klientem, dając jednocześnie klientowi możliwość modyfikacji jego działania.

Zagadnienia powiązane

leniwa inicjalizacjaOpóźnia tworzenie obiektu do chwili w której następuje jego pierwsze użycie. (wzorzec projektowy)