Prototype¶
Przeznaczenie
Określa rodzaj tworzonych obiektów, używając prototypowego egzemplarza
Tworzy nowe obiekty, kopiując ten prototyp
Zapewnia klientowi możliwość generowania obiektów, których typ nie jest znany
Kontekst
Rzeczywiste typy obiektów, które chcemy utworzyć nie są znane
Klasy, których instancje chcemy tworzyć, są ładowane dynamicznie
Stan obiektów klasy może przyjmować tylko jedną z kilku dozwolonych wartości
Problem
Chcemy tworzyć nowe egzemplarze obiektów bez wiedzy o tym, jaka jest ich konkretna klasa
Chcemy uniknąć budowania hierarchii klas fabryk, która jest porównywalna z hierarchią klas produktów
Struktura¶

Uczestnicy¶
Prototype – deklaruje interfejs klonowania się
ConcretePrototype – implementuje operację klonowania się
Client – tworzy nowy obiekt, prosząc prototyp o sklonowanie się
Współpraca¶
Klient prosi prototyp o sklonowanie się.
Konsekwencje¶
Dodawanie i usuwanie produktów w czasie wykonywania programu. Prototype ułatwia włączanie do systemu nowych produktów konkretnych przez rejestrowanie prototypowych egzemplarzy u klienta. Jest to bardziej elastyczne rozwiązanie niż w przypadku innych wzorców kreacyjnych.
Umożliwia specyfikowanie nowych prototypowych obiektów przez urozmaicanie struktury. Złożone struktury definiowane w trakcie działania programu mogą być również klonowane.
Zredukowana liczba podklas.
Implementacja¶
Szczególnie użyteczny ze statycznymi językami, takimi jak C++, gdzie klasy nie są obiektami, a podczas wykonywania programu jest dostępnych mało (jeśli w ogóle) informacji o typach.
Przy implementowaniu prototypów należy rozważyć:
Używanie menedżera prototypów – tablicy asocjacyjnej, która przekazuje prototyp pasujący do podanego klucza, mającej operacje do rejestrowania prototypu pod podanym kluczem i do wyrejestrowywania go.
Implementowanie operacji Clone – płytka/głęboka kopia obiektu.
Inicjowanie klonów – jeśli w klasach rozważanego prototypu są już zdefiniowane operacje ustalania wartości istotnej części stanu obiektów, to klienci mogą użyć tych operacji bezpośrednio po klonowaniu.
Wzorce pokrewne¶
Abstract Factory – rywalizuje z wzorcem Prototype. Można jednak używać obu wzorców razem. Abstract Factory może przechowywać zbiór prototypów, z których mają być klonowane obiekty-produkty.
Composite, Decorator – wzorce te są często używane wraz ze wzorcem Prototype.
Podsumowanie¶
Wzorzec umożliwia tworzenie nowych obiektów poprzez kopiowanie prototypowego egzemplarza.
Klasy, których egzemplarze są klonowane, mogą być specyfikowane w trakcie wykonania programu.
Pozwala uprościć hierarchię klas fabryk, która jest porównywalna z hierarchią klas produktów.