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.