Wzorce projektowe
prototyp
[wzorzec projektowy] Umożliwia tworzenie prawidłowej kopii obiektu z poziomu interfejsu.Budowa wzorca projektowego
class IPrototype
{
public:
virtual IPrototype * Klonuj() const = 0;
virtual ~IPrototype() { }
};
class CMyPrototype1
: public IPrototype
{
private:
int m_iLiczba;
public:
CMyPrototype1( int iLiczba )
: m_iLiczba( iLiczba )
{
}
CMyPrototype1( const CMyPrototype1 & kopia )
: m_iLiczba( kopia.m_iLiczba )
{
}
virtual IPrototype * Klonuj() const
{
return new CMyPrototype1( * this );
}
};
class CMyPrototype2
: public IPrototype
{
virtual IPrototype * Klonuj() const
{
return NULL;
}
};
Opis szczegółowy
Prototyp (
ang. prototype) - wzorzec projektowy, który umożliwia tworzenie prawidłowej kopii obiektu z poziomu interfejsu.
Zastosowanie
Niniejszy wzorzec projektowy stosuje się gdy:
Dodatkowe informacje
Problemy w implementacji niniejszego wzorca projektowego mogą się pojawić gdy dane znajdujące się w obiekcie mają powiązania cykliczne.
Implementacja klasy opartej o wzorzec projektowy prototyp powinna zapewniać, że pracując na kopii obiektu nie będziemy mieli możliwości zmodyfikowania danych pierwotnego obiektu z którego uzyskaliśmy kopię.
Przykład
#include <cstdio>
#include <cstring>
class IPrototype
{
public:
virtual IPrototype * Klonuj() const = 0;
virtual void Wypisz() const = 0;
virtual ~IPrototype() { }
};
class CMyPrototype1
: public IPrototype
{
private:
int m_iLiczba;
char * m_pNapis;
public:
CMyPrototype1( int iLiczba, const char * sNapis )
: m_iLiczba( iLiczba )
, m_pNapis( new char[ strlen( sNapis ) + 1 ] )
{
strcpy( m_pNapis, sNapis );
}
CMyPrototype1( const CMyPrototype1 & kopia )
: m_iLiczba( kopia.m_iLiczba )
, m_pNapis( new char[ strlen( kopia.m_pNapis ) + 1 ] )
{
strcpy( m_pNapis, kopia.m_pNapis );
}
virtual ~CMyPrototype1()
{
delete[] m_pNapis;
}
virtual IPrototype * Klonuj() const
{
return new CMyPrototype1( * this );
}
virtual void Wypisz() const
{
printf( "Liczba = %d\n", m_iLiczba );
printf( "Komunikat = \"%s\"\n", m_pNapis );
}
};
int main()
{
IPrototype * pObiekt1 = new CMyPrototype1( 123, "raz dwa trzy" );
IPrototype * pObiekt2 = pObiekt1->Klonuj();
delete pObiekt1;
pObiekt2->Wypisz();
delete pObiekt2;
return 0;
}
Standardowe wyjście programu:
Liczba = 123
Komunikat = "raz dwa trzy"
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.