Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 4432 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:

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

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