W .NET istnieje interfejs ICloneable, który dostarcza metody Clone.
Spójrzmy na diagram klas dla tego wzorca:
Klasy, które uczestniczą we wzorcu:
Prototype - udostępnia interfejs klonowania obiektu
ConcretePrototype1 i ConcretePrototype2 - implementują interfejs Prototype dając możliwość klonowania samego siebie
Client - tworzy nowe obiektu poprzez wywołanie metody Clone
Jak wspominałem wcześniej w .NET istnieje już gotowy interfejs ICloneable. Zobaczmy w jaki sposób można go zaimplementować:
Code:
W kodzie w metodzie Clone widać zakomentowany kod. Otóż należy być bardzo uważnym podczas implementowania metody Clone. Chodzi o to iż są dwa rodzaje klonowania - deep copy oraz shell copy. Shell copy wykonuje tzw. płytką kopię czyli przepisuje wartości pól. Deep copy przepisuje to co znajduje się pod danym polem. Jeżeli jakieś pole jest referencją, to w przypadku shell copy przepiszemy tylko tę referencję, jeżeli mamy do czynienia z deep copy - obiekt zostanie skopiowany.
Miejmy powyższe zdanie w pamięci i zgodnie z zaleceniami większości deweloperów, podczas implementowania interfejsu ICloneable implementujmy deep copy.
Brak komentarzy:
Prześlij komentarz