Prototyp – Wzorzec Projektowy (Prototype)

Prototyp (ang. Prototype) – wzorzec projektowy. Przykład zastosowania oparty na przykładzie w celu łatwiejszego zrozumienia tego wzorca dla laika.

James miał firmę, która zajmowała się składaniem i sprzedawaniem hulajnóg. Hulajnoga składa się z czterech elementów: kierownicy, kolek, hamulca i naklejki. Klient miał możliwość stworzenia swojej własnej hulajnogi, która składała się z elementów pochodzących od rożnych producentów. Klient miał możliwość samemu wybrać sobie z jakich elementów chciałby, żeby jego hulajnoga się składała. Andrzej chce kupić hulajnogę. Andrzej zażyczył sobie, aby jego hulajnoga miała szwajcarska kierownice, niemieckie hamulce, chińska naklejkę i polskie kolka. W celu zamówienia spersonalizowanej hulajnogi Andrzej musi wypełnić formularz z jakich elementów ma się składać hulajnoga.

Wszystko oczywiście powędrowało do odpowiedniego formularza.

Zadowolony Andrzej wraca do domu z swoją hulajnogą.

Andrzej wrócił jednak po tygodniu do Jamesa ze swoją hulajnogą. Tak mu się spodobała jego hulajnoga, że chce mieć jeszcze jedną taką samą hulajnogę. Więc na nowo powinien wypełnić formularz.

Prototyp – Czy można to zrobić bez wypełniania formularza?

Tak, można. Można wyprodukować nową hulajnogę bazując na już istniejącej. W tym celu można stworzyć metodę Clone w NiestandardowejHulajnodze, która zwraca taki sam obiekt – z tymi samymi wartościami w polach.

Użycie tego jest bardzo proste:

Niestandardowa hulajnoga:
Kierownica: Szwajcaria
Naklejka: Chiny
Hamulce: Niemcy
Koła: Polska

Prototyp – Zróbmy to profesjonalnej

Dodajmy interface do metody Clone.

Poprawmy klasę NiestandrardowejHulajnogi.

Skopiowaliśmy hulajnogę! Super. Ale można zrobić to jeszcze ładniej. MemberwiseClone jest metodą, którą dostarcza nam .NET. Metoda ta klonuje swoją instancę.

W naszym przykładzie metoda MemberwiseClone tworzy nową instancję NiestandardowejHulajnogi – czyli obiekt sklonowanaHulajowa. Następnie kopiuje wartości z oryginalnego obiektu na którym metoda Clone została wywołana do pól w nowo powstałej instancji – czyli wartości z kierownicy, naklejki itd.

Jednak MemberwiseCloce działa tak jakbyśmy chcieli dla:

  • Typów prostych jak np. int, byte.
  • String (spójrz linki na dole)
  • Enumeratory
  • Proste struktury, które pola posiadają tylko typy wyżej wymienione

Wszystko o czym do tej pory czytałeś odnosi się do shallow coping.

 

A co z klasami? Co jeżeli jakieś pole to referencja do  klasy? – ktoś zapytał. W tym momencie kopiowana jest referencja. Nie tworzony jest nowy obiekt klasy podrzędnej. Jeżeli chcielibyśmy się bardziej klonowaniem pól z klasami to  mamy do czynienia z deep coping.

 

Prototyp – przydatne linki

Klonowanie wg Microsoftu

Dlaczego shallow copying działa dla stringa?

Czy używanie Icloneable ma sens?

Powered by: Wordpress