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

prototyp

[wzorzec projektowy] Umożliwia tworzenie prawidłowej kopii obiektu z poziomu interfejsu.

Budowa wzorca projektowego

C/C++
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
    {
        //INFO: Przykładowa implementacja klonowania
        return new CMyPrototype1( * this );
    }
};

class CMyPrototype2
    : public IPrototype //INFO: konkretny prototyp
{
    virtual IPrototype * Klonuj() const
    {
        return NULL; //INFO: klonowanie obiektu zabronione
    }
};

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:
  • chcesz mieć możliwość otrzymania prawidłowej kopii obiektu z poziomu interfejsu;
  • chcesz tworzyć nowe obiekty z wcześniej przygotowanych obiektów (zwanych prototypami);
  • chcesz mieć możliwość przywrócenia obiektu do stanu w którym się znajdował w chwili jego zapamiętania.

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

C/C++
#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
    {
        //INFO: Przykładowa implementacja klonowania
        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"