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
class IProduct
{
public:
virtual ~IProduct() { }
};
class TLazyCreator
{
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
class IProduct
{
public:
virtual ~IProduct() { }
};
template < class t_product >
class LazyCreator
{
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
metoda wytwórcza.
Zastosowanie
Wzorzec leniwej inicjalizacji stosuje się gdy:
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
#include <cstdio>
class IProduct
{
public:
virtual ~IProduct() { }
};
class TLazyCreator
{
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
{
public:
CMyProduct()
{
printf( "Utworzylem CMyProduct.\n" );
}
};
class CMyLazyCreator
: public TLazyCreator
{
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
#include <cstdio>
class IProduct
{
public:
virtual ~IProduct() { }
};
template < class t_product >
class LazyCreator
{
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
{
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órcza | Dostarcza 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) |
---|
Wszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści poza niniejszym serwisem
jest zabronione.
Powyższe ograniczenie nie dotyczy autora opracowania, któremu przysługuje prawo do rozpowszechniania własnego tekstu wedle własnego uznania.