Wzorce projektowe – kreacyjne Builder Prototype
Transkrypt
Wzorce projektowe – kreacyjne Builder Prototype
WYKŁAD 5 Wzorce projektowe – kreacyjne Builder Prototype Creational Design Pattern: Builder Oddziela konstrukcj obiektów zło onych od ich reprezentacji umo liwiaj c tym samym powstawanie w jednym procesie konstrukcyjnym ró nych reprezentacji. Uzasadnienie stosowania: Problem przekształcania formatu RTF do innych formatów. Ze wzgl du na du ilo mo liwych konwersji powinno da si łatwo dodawa nowe bez modyfikowania klienta. Czytnik RTF AnalizujRTF() KonwerterTek stowy +budowniczy PrzeksztalcZnak() PrzeksztalcZmianeCzcionki() PrzeksztalcAkapit() KonwerterNaA SCII PrzeksztalcZnak() PodajTekstASCII() TekstASCII KonwerterNaTeX PrzeksztalcZnak() PrzeksztalcZmianeCzcionki() PrzeksztalcAkapit() PodajTekstTeX() TekstTeX Stosowalno : • algorytm tworzenia obiektu zło onego niezale ny od cz ci składowych tego obiektu i sposobu ich zestawiania • proces konstruowania musi uwzgl dnia ró ne reprezentacje konstruowanego obiektu Struktura: Kierownik Konstruuj() dla kazdego obiekt u z e st rukt ury{ budowniczy->ZbudujCz esc() } +budowniczy Budowniczy ZbudujCzesc() BudowniczyKonkret ny ZbudujCzesc() PodajWynik() Produkt Uczestnicy: • Budowniczy (KonwerterTekstowy) – okre la interfejs abstrakcyjny do tworzenia cz ci składowych obiektu Produkt • BudowniczyKonkretny (KonwerterNaASCII, KonwerterNaTeX) – konstruuje i zestawia cz produktu poprzez implementowanie interfejsu Budowniczego – definiuje i kontroluje tworzon przez siebie reprezentacj – zapewnia interfejs do wyszukiwania produktu (np.. PodajTekstASCII) • Kierownik (CzytnikRTF) – konstruuje obiekt u ywaj c interfejsu Budowniczego • Produkt (TekstASCII, TekstTeX) – reprezentuje konstruowany obiekt zło ony; klasa BudowniczyKonkretny buduje wewn trzn reprezentacj produktu i definiuje proces składania go; – zawiera klasy definiuj ce cz ci składowe, wł czaj c w to interfejsy zestawiaania cz ci w ko cowy wynik Współpraca: • Klient tworzy obiekt Kierownik i konfiguruje go za pomoc po danego obiektu Budowniczy • Kierownik informuje budowniczego o potrzebie zbudowania cz ci produktu • Budowniczy przetwarza dania klienta i dodaje cz ci do produktu • Klient odbiera produkt od Budowniczego Konsekwencje: • Umo liwienie zmiany wewn trznej reprezentacji produktu • Oddzielenie kodu słu cego do konstruowania od reprezentacji – ró ni Kierownicy mog ponownie u ywa kodu do budowania ró nych wariantów Produktu z tego samego zestawu cz ci • Lepsza kontrola procesu konstruowania – nie za jednym podej ciem ale krok po kroku, na zako czenie kierownik pobiera produkt od budowniczego Implementacja: • klasa Budowniczy zawiera zwykle puste metody, a BudowniczyKonkretny nadpisuje je • interfejs montowania i konstruowania • brak klasy abstrakcyjnej produktów – zbyt du e ró nice Przykłady: Znane zastosowania: • konwerter RTF • Parser w Smalltalk • BudowniczyKlas • Strumie KodówBajtowych Pokrewne wzorce: AbstractFactory te mo e konstruowa obiekty zło one, ale nie krok po kroku ale raczej całe rodziny produktów. Budowniczy przekazuje produkt w ostatnim kroku, a Fabryka Abstrakcyjna natychmiast. Budowniczych cz sto u ywa si do budowania obiektów Composite. Creational Design Pattern: Prototype Specyfikuje rodzaje tworzonych obiektów, u ywaj c prototypowego egzemlarza, a tak e tworzy nowe obiekty, kopiuj c ten prototyp. Uzasadnienie stosowania: Edytor partytur muzycznych. ObiektGraficzny reprezentuje komponenty graficzne (np. nuty, pi ciolinia). Narzedzie definiuje narz dzia. NarzedzieGraficzne słu y do reprezentowania tych narz dzi, które tworz egzemplarze obiektów graficznych i dodaj je do dokumentu. NarzedzieGraficzne jest cz ci zr bu, a klasy reprezentuj ce obiekty graficzne s jednym z mo loiwych zastosowa . NarzedzieGraficzne nie wie jak tworzy egzemplarze klas muzycznych. Podklasy NarzedzieGraficzne nie sa rozwi zaniem – za du o podklas i za mało ró nic. Nale y sparametryzowa NarzedzieGraficzne klas ObiektGraficzny. Narzedzie Obiek tGraficzny +prototyp Klonuj() Rysuj(pozycja) Operacja() NarzedzieObracajace NarzedzieGraficzne Pieciolinia Nuta Klonuj() Rysuj(pozycja) p = prototyp->Klonuj() while(uzytkownik prz eciaga myszka){ p->Rysuj(nowa pozycja) } wstaw p do ry sunku CalaNut a PolNut a Klonuj() Rysuj(pozy cja) Klonuj() Rysuj(pozycja) ret urn kopia siebie samego return kopia siebie samego Co wi cej, mo na zmniejszy tu ilo klas – zamiast mie oddzielne klasy dla ró nych rodzajów nut mo emy mie jedn klas inicjowan ró nymi bitmapami i okresami trwania. Łatwiej te wtedy dodawa nowe nuty – nie trzeba tworzy dla nich nowych klas. Stosowalno : • niezale no systemu od sposobu tworzenia produktów, składania ich oraz reprezentowania oraz • klasy, których egzemplarze tworzymy s specyfikowane w czasie wykonania lub • unikni cie budowania hierarchii klas fabryk (tyle co produktów) lub • stan obiektów klasy mo e przyjmowa tylko jedn z kilku warto ci; klonowanie ró nie zainicjowanych prototypów Struktura: Klient +prot otyp Operacja() p = prototyp->Klonuj() Prototyp Klonuj() PrototypKonk ret ny1 PrototypKonkretny2 Klonuj() Klonuj() ret urn kopia siebie samego return kopia siebie samego Uczestnicy: • Prototyp (ObiektGraficzny) – deklaruje interfejs klonowania • PrototypKonkretny (Pi ciolinia, CałaNuta) – implementuje operacj klonowania si • Klient (Narz dzie Graficzne) – tworzy nowy obiekt prosz c prototyp o sklonowanie si Współpraca: • Klient prosi prototyp o sklonowanie si Konsekwencje: Podobne do konsekwencji AbstractFactory i Builder. Dodatkowo: • dodawanie i usuwanie produktów w czasie wykonania programu • Specyfikowanie nowych obiektów przez zmienianie warto ci • specyfikowanie nowych obiektów przez urozmaicanie struktury – przykład podukładów elektronicznych • zredukowana ilo podklas – w porównaniu z FactoryMethod (#Tworca = #produkt); mo emy nie mie hierarchii klasy Tworca • dynamiczne konfigurowanie aplikacji za pomoc klas Główny problem wzorca to zapewnienie klonowania. Implementacja: • u ywanie managera prototypów • implementowanie operacji Klonuj() – dyskusja kwestii kopii płytkich, gł bokich, mieszanych, nawi zanie do problemów z wzorcem Singleton (klonowanie i współbie no ) • inicjowanie klonów – trudno ci z inicjowaniem stanu przekazywanego przez metod Klonuj(), bo zepsucie interfejsu. Zamiast tego sekwencja Klonuj(), Inicjuj(args) Przykłady: Znane zastosowania: Pokrewne wzorce: Prototype i AbstractFactory rywalizuj , ale mo na je ł czy . Wzorzec AbstractFactory mo e przechowywa zbiór prototypów, z których mog by klonowane produkty. Stosuje si dla Composite i Decorator. WZORCE PROJEKTOWE STRUKTURALNE Omówimy (W6-W8): • Decorator • Composite • Adapter • Bridge • Facade • Proxy