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

leniwa inicjalizacja

[wzorzec projektowy] Opóźnia tworzenie obiektu do chwili w której następuje jego pierwsze użycie.

Budowa wzorca projektowego

Rozwiązanie obiektowe

C/C++
class IProduct //INFO: dowolny interfejs produktu
{
public:
    virtual ~IProduct() { }
};

class TLazyCreator //INFO: leniwa inicjalizacja
{
private:
    IProduct * m_pProduct;
public:
    IProduct * GetProduct()
    {
        if( !m_pProduct )
             m_pProduct = CreateProduct();
       
        return m_pProduct;
    }
   
    TLazyCreator()
        : m_pProduct( NULL )
    {
    }
protected:
    virtual IProduct * CreateProduct() = 0;
};

Rozwiązanie szablonowe

C/C++
class IProduct //INFO: dowolny interfejs produktu
{
public:
    virtual ~IProduct() { }
};

template < class t_product >
class LazyCreator //INFO: leniwa inicjalizacja
{
private:
    IProduct * m_pProduct;
public:
    IProduct * GetProduct()
    {
        if( !m_pProduct )
             m_pProduct = CreateProduct();
       
        return m_pProduct;
    }
   
    LazyCreator()
        : m_pProduct( NULL )
    {
    }
protected:
    virtual IProduct * CreateProduct()
    {
        return new t_product;
    }
};

Opis szczegółowy

Leniwa inicjalizacja (ang. lazy initialization) - wzorzec projektowy, który opóźnia tworzenie obiektu do chwili w której następuje pierwsze jego użycie. Niniejszy wzorzec jest ściśle powiązany ze wzorcem projektowym » Wzorce projektowe » Wzorce kreacyjnemetoda wytwórcza wzorzec projektowy.

Zastosowanie

Wzorzec leniwej inicjalizacji stosuje się gdy:
  • chcemy zapewnić istnienie obiektu w chwili jego użycia;
  • nie chcemy pamiętać o konieczności tworzenia obiektu.

Dodatkowe informacje

Niniejszy wzorzec warto zastosować gdy mamy sytuację w której produkt zużywa duże zasoby podczas inicjalizacji (np. wczytywanie muzyki w celu odtworzenia).

Przykłady

Rozwiązanie obiektowe

C/C++
#include <cstdio>

class IProduct //INFO: dowolny interfejs produktu
{
public:
    virtual ~IProduct() { }
};

class TLazyCreator //INFO: leniwa inicjalizacja
{
private:
    IProduct * m_pProduct;
public:
    IProduct * GetProduct()
    {
        if( !m_pProduct )
             m_pProduct = CreateProduct();
       
        return m_pProduct;
    }
   
    TLazyCreator()
        : m_pProduct( NULL )
    {
    }
protected:
    virtual IProduct * CreateProduct() = 0;
};

class CMyProduct
    : public IProduct //INFO: implementacja produktu
{
public:
    CMyProduct()
    {
        printf( "Utworzylem CMyProduct.\n" );
    }
};

class CMyLazyCreator
    : public TLazyCreator //INFO: implementacja leniwej inicjalizacji
{
    virtual IProduct * CreateProduct()
    {
        return new CMyProduct;
    }
};

int main()
{
    CMyLazyCreator object;
    printf( "CMyLazyCreator utworzony.\n" );
    IProduct * pProduct = object.GetProduct();
    printf( "Szykujemy sie do sprzatania.\n" );
    delete pProduct;
   
    return 0;
}
Standardowe wyjście programu:
CMyLazyCreator utworzony.
Utworzylem CMyProduct.
Szykujemy sie do sprzatania.

Rozwiązanie szablonowe

C/C++
#include <cstdio>

class IProduct //INFO: dowolny interfejs produktu
{
public:
    virtual ~IProduct() { }
};

template < class t_product >
class LazyCreator //INFO: leniwa inicjalizacja
{
private:
    IProduct * m_pProduct;
public:
    IProduct * GetProduct()
    {
        if( !m_pProduct )
             m_pProduct = CreateProduct();
       
        return m_pProduct;
    }
   
    LazyCreator()
        : m_pProduct( NULL )
    {
    }
protected:
    virtual IProduct * CreateProduct()
    {
        return new t_product;
    }
};

class CMyProduct
    : public IProduct //INFO: implementacja produktu
{
public:
    CMyProduct()
    {
        printf( "Utworzylem CMyProduct.\n" );
    }
};

int main()
{
    LazyCreator < CMyProduct > object;
    printf( "LazyCreator<CMyProduct> utworzony.\n" );
    IProduct * pProduct = object.GetProduct();
    printf( "Szykujemy sie do sprzatania.\n" );
    delete pProduct;
   
    return 0;
}
Standardowe wyjście programu:
LazyCreator<CMyProduct> utworzony.
Utworzylem CMyProduct.
Szykujemy sie do sprzatania.

Zagadnienia powiązane

metoda wytwórczaDostarcza interfejs do tworzenia obiektów, gwarantując jednocześnie możliwość zmiany obiektów jakie będą tworzone przez wzorzec w klasach potomnych. (wzorzec projektowy)