Wzorzec projektowy prototyp - prototype

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

Listing 1
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. class iTankPrototype{
  5. protected:
  6. std::string tankType;
  7. public:
  8. virtual void getTankDescription() = 0;
  9. virtual iTankPrototype* copy() = 0;
  10. enum TankType{
  11. A1M1_Abrams,
  12. T34
  13. };
  14. };
  15. class A1M1_Abrams : public iTankPrototype{
  16. public:
  17. inline A1M1_Abrams(){
  18. tankType = "A1M1 Abrams";
  19. std::cout<<tankType<<std::endl;
  20. }
  21. virtual void getTankDescription(){
  22. std::cout<<"Czolg "<<tankType<<std::endl;
  23. }
  24. virtual iTankPrototype* copy(){
  25. return new A1M1_Abrams();
  26. }
  27. };
  28. class T34 : public iTankPrototype{
  29. public:
  30. inline T34(){
  31. tankType = "T34";
  32. std::cout<<tankType<<std::endl;
  33. }
  34. virtual void getTankDescription(){
  35. std::cout<<"Czolg "<<tankType<<std::endl;
  36. }
  37. virtual iTankPrototype* copy(){
  38. return new T34();
  39. }
  40. };
  41. class Factory{
  42. public:
  43. static iTankPrototype* makeTank(iTankPrototype::TankType tankType){
  44. std::cout<<"Tworze czolg ";
  45. return tankPrototypes[tankType]->copy();
  46. }
  47. private:
  48. static iTankPrototype* tankPrototypes[2];
  49. };
  50. iTankPrototype* Factory::tankPrototypes[] = {new A1M1_Abrams(), new T34()};
  51. int main(){
  52. iTankPrototype* a1m1_abrams = Factory::makeTank(iTankPrototype::TankType::A1M1_Abrams);
  53. iTankPrototype* t34 = Factory::makeTank(iTankPrototype::TankType::T34);
  54. std::cin.get();
  55. return 0;
  56. }

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

Komentarze