Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 4570 razy

Opis wzorca projektowego prototyp

Prototyp jest wzorcem projektowym kreacyjnym, w którym tworzy się grupę prototypowych obiektów, na podstawie których klasa fabryka tworzy kopie prototypów i zwraca ich interfejs.

Diagram UML wzorca projektowego prototyp

Przykładowy diagram UML wzorca projektowego prototyp można zobaczyć na poniższej ilustracji. Jak widać interfejs iTankPrototype jest dziedziczony przez dwie klasy:

  • A1M1_Abrams;
  • T34

Prototypy tych klas przechowywane są w statycznej zmiennej tablicowej tankPrototype[2], które pod indeksem:

  • iTankPrototype::TankType::A1M1_Abrams = 0 przechowuje wskaźnik na interfejs obiektu klasy A1M1_Abrams;
  • iTankPrototype::TankType::T34 = 1 przechowuje wskaźnik na interfejs obiektu klasy T34

W tej samej klasie znajduje się statyczna metoda makeTank, która jako parametr przyjmuje iTankPrototype::TankType. Na podstawie tego parametru tworzona jest kopia prototypowego obiektu i zwracany jego interfejs.

Przykład diagramu UML wzorca projektowego typu prototyp
Rys. 1
Przykład diagramu UML wzorca projektowego typu prototyp

Przykładowa implementacja wzorca projektowego prototyp

Oto przykład implementacji tego wzorca w języku C++:

#include <iostream> #include <string> #include <map> class iTankPrototype{ protected: std::string tankType; public: virtual void getTankDescription() = 0; virtual iTankPrototype* copy() = 0; enum TankType{ A1M1_Abrams, T34 }; }; class A1M1_Abrams : public iTankPrototype{ public: inline A1M1_Abrams(){ tankType = "A1M1 Abrams"; std::cout<<tankType<<std::endl; } virtual void getTankDescription(){ std::cout<<"Czolg "<<tankType<<std::endl; } virtual iTankPrototype* copy(){ return new A1M1_Abrams(); } }; class T34 : public iTankPrototype{ public: inline T34(){ tankType = "T34"; std::cout<<tankType<<std::endl; } virtual void getTankDescription(){ std::cout<<"Czolg "<<tankType<<std::endl; } virtual iTankPrototype* copy(){ return new T34(); } }; class Factory{ public: static iTankPrototype* makeTank(iTankPrototype::TankType tankType){ std::cout<<"Tworze czolg "; return tankPrototypes[tankType]->copy(); } private: static iTankPrototype* tankPrototypes[2]; }; iTankPrototype* Factory::tankPrototypes[] = {new A1M1_Abrams(), new T34()}; int main(){ iTankPrototype* a1m1_abrams = Factory::makeTank(iTankPrototype::TankType::A1M1_Abrams); iTankPrototype* t34 = Factory::makeTank(iTankPrototype::TankType::T34); std::cin.get(); return 0; }

Wynik działania powyższego kodu:

A1M1 Abrams
T34
Tworze czolg A1M1 Abrams
Tworze czolg T34
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/prototype - strona z opisem wzorca prototype [En]
  2. pl.wikipedia.org - opis wzorca na stronie Wikipedii
Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.