Wzorzec projektowy prototyp - prototype
Stronę tą wyświetlono już: 3378 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ł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

Tytuł:
React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III
Autor:
Carlos Santana Roldán

Tytuł:
Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II
Autor:
Eric Freeman, Elisabeth Robson

Tytuł:
Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#
Autor:
Dmitri Nesteruk

Tytuł:
Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku
Autor:
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Tytuł:
Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III
Autor:
Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

Tytuł:
Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych
Autor:
Bilgin Ibryam, Roland Huß

Tytuł:
Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#
Autor:
Dmitri Nesteruk

Tytuł:
Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II
Autor:
Alan Shalloway, James R. Trott

Tytuł:
Java EE 8. Wzorce projektowe i najlepsze praktyki
Autor:
Rhuan Rocha, Joao Purificacao

Tytuł:
Systemy reaktywne. Wzorce projektowe i ich stosowanie
Autor:
Roland Kuhn Dr., Brian Hanafee, Jamie Allen