Wzór twórczy: Prototyp
W tym artykule omówiono sposób tworzenia nowych obiektów z istniejących obiektów przy użyciu wzorca prototypu.
Co to jest?
Wzór Prototype to wzór kreacyjny, w którym nowe obiekty są tworzone poprzez kopiowanie istniejącego obiektu. Obiekt, którego kopie są wykonywane, nazywany jest prototypem . Aby lepiej zrozumieć obiekty, możesz uznać obiekt prototypowy za „ziarno”, z którego powstają wszystkie inne obiekty. Możesz więc zapytać, dlaczego nie miałbyś tworzyć nowych obiektów w razie potrzeby zamiast klonować istniejące. Motywacje obiektów prototypowych są następujące:
- Czasami utworzenie nowego obiektu jest droższe niż skopiowanie istniejącego.
- Wyobraź sobie, że nie możesz uzyskać statycznego dostępu do konstruktora klasy, a środowisko wykonawcze musi utworzyć instancję każdej dynamicznie ładowanej klasy. Zamiast tego aplikacja mogłaby żądać obiektów od menedżera prototypów , który zwracałby klony prototypów.
- Możesz znacznie zmniejszyć liczbę klas w systemie, zmieniając wartości sklonowanych obiektów z instancji prototypowej.
Diagram klas
Diagram klas zawiera następujące jednostki:
- Prototyp
- Betonowy prototyp
- Klient
Weźmy przykład samolotu, aby lepiej zrozumieć wzór prototypu. Najpierw stworzyliśmy klasę reprezentującą F-16. Ale wiemy, że F-16 ma kilka wariantów. Aby więc reprezentować każdy z wariantów F16, możemy stworzyć podklasy. Ale wtedy skończymy z kilkoma podklasami w naszym systemie. Dodatkowo załóżmy, że warianty F16 różnią się jedynie typem silnika. Wtedy jedną z możliwości byłoby zachowanie jednej klasy F16, ale dodanie metody ustawiania typu silnika samolotu. W ten sposób możemy stworzyć pojedynczy obiekt F16 jako prototyp i sklonować go dla różnych wersji samolotów.
Najpierw tworzymy interfejs.
Klasa F-16 implementuje swój interfejs w następujący sposób:
Klient może użyć wzoru w następujący sposób:
Należy zauważyć, że metoda klonowania interfejsu IAircraftPrototype zwraca typ abstrakcyjny . Klienci nie wiedzą, jakie różne implementacje tego samego interfejsu utworzą konkretne podklasy. Na przykład klasa Boeing747 może zostać przekazana, tworząc kopie dowolnego przekazanego prototypu (F16 lub Boeing747). Wzorzec prototypu pomaga wyeliminować podklasy, ponieważ zachowanie obiektów prototypowych można zmieniać, składając je z części podrzędnych.
Płytka kontra głęboka kopia
Wzorzec prototypu wymaga klasy lub interfejsu prototypu do zaimplementowania metody clone() . Klonowanie może być płytkie lub głębokie. Na przykład, jeśli nasza klasa F-16 ma obiekt członkowski typu F16Engine , w płytkiej kopii sklonowany obiekt wskazywałby na ten sam obiekt F16Engine , co prototyp. Ale w głębokiej kopii sklonowany obiekt otrzymałby kopię swojego obiektu silnika i wszelkie obiekty zagnieżdżone w nim. Nie będzie współdzielenia jakichkolwiek pól — zagnieżdżonych lub innych — między prototypem a jego klonem.
Ładowanie dynamiczne
Wzorzec prototypu może ułatwić dynamiczne ładowanie klas. Ładowanie dynamiczne umożliwia ładowanie klasy w czasie wykonywania zamiast udostępniania klasy w czasie kompilacji. W języku obsługującym ładowanie dynamiczne framework utworzy instancję załadowanej klasy i zarejestruje ją w jednostce zarządzającej. Następnie w czasie wykonywania aplikacja może poprosić tego menedżera o udostępnienie obiektu należącego do tej klasy.
Inne przykłady
W języku programowania Java klasa Object ma metodę klonowania. Klasa implementuje interfejs java.lang.Cloneable .
Zastrzeżenia
Implementacja metody klonowania może być trudna ze względu na odwołania cykliczne.

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































