WYKŁAD 5 Wzorce projektowe kreacyjne Builder Prototype
Creational Design Pattern: Builder Oddziela konstrukcj obiektów złoonych od ich reprezentacji umoliwiajc tym samym powstawanie w jednym procesie konstrukcyjnym rónych reprezentacji.
Uzasadnienie stosowania: Problem przekształcania formatu RTF do innych formatów. Ze wzgldu na du ilo moliwych konwersji powinno da si łatwo dodawa nowe bez modyfikowania klienta.
Czytnik RTF AnalizujRTF() +budowniczy KonwerterTek stowy PrzeksztalcZnak() PrzeksztalcZmianeCzcionki() PrzeksztalcAkapit() KonwerterNaA SCII PrzeksztalcZnak() PodajTekstASCII() KonwerterNaTeX PrzeksztalcZnak() PrzeksztalcZmianeCzcionki() PrzeksztalcAkapit() PodajTekstTeX() TekstASCII TekstTeX
Stosowalno: algorytm tworzenia obiektu złoonego niezaleny od czci składowych tego obiektu i sposobu ich zestawiania proces konstruowania musi uwzgldnia róne reprezentacje konstruowanego obiektu Struktura:
Kierownik Konstruuj() +budowniczy Budowniczy ZbudujCzesc() dla kazdego obiektu ze struktury{ budowniczy->zbudujcz esc() } BudowniczyKonkret ny ZbudujCzesc() PodajWynik() Produkt
Uczestnicy: Budowniczy (KonwerterTekstowy) okrela interfejs abstrakcyjny do tworzenia czci 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 uywajc interfejsu Budowniczego Produkt (TekstASCII, TekstTeX) reprezentuje konstruowany obiekt złoony; klasa BudowniczyKonkretny buduje wewntrzn reprezentacj produktu i definiuje proces składania go; zawiera klasy definiujce czci składowe, włczajc w to interfejsy zestawiaania czci w kocowy wynik
Współpraca: Klient tworzy obiekt Kierownik i konfiguruje go za pomoc podanego obiektu Budowniczy Kierownik informuje budowniczego o potrzebie zbudowania czci produktu Budowniczy przetwarza dania klienta i dodaje czci do produktu Klient odbiera produkt od Budowniczego
Konsekwencje: Umoliwienie zmiany wewntrznej reprezentacji produktu Oddzielenie kodu słucego do konstruowania od reprezentacji róni Kierownicy mog ponownie uywa kodu do budowania rónych wariantów Produktu z tego samego zestawu czci Lepsza kontrola procesu konstruowania nie za jednym podejciem ale krok po kroku, na zakoczenie 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 due rónice Przykłady:
Znane zastosowania: konwerter RTF Parser w Smalltalk BudowniczyKlas StrumieKodówBajtowych
Pokrewne wzorce: AbstractFactory te moe konstruowa obiekty złoone, ale nie krok po kroku ale raczej całe rodziny produktów. Budowniczy przekazuje produkt w ostatnim kroku, a Fabryka Abstrakcyjna natychmiast. Budowniczych czsto uywa si do budowania obiektów Composite.
Creational Design Pattern: Prototype Specyfikuje rodzaje tworzonych obiektów, uywajc prototypowego egzemlarza, a take tworzy nowe obiekty, kopiujc ten prototyp.
Uzasadnienie stosowania: Edytor partytur muzycznych. ObiektGraficzny reprezentuje komponenty graficzne (np. nuty, piciolinia). Narzedzie definiuje narzdzia. NarzedzieGraficzne słuy do reprezentowania tych narzdzi, które tworz egzemplarze obiektów graficznych i dodaj je do dokumentu.
NarzedzieGraficzne jest czci zrbu, a klasy reprezentujce obiekty graficzne s jednym z moloiwych zastosowa. NarzedzieGraficzne nie wie jak tworzy egzemplarze klas muzycznych. Podklasy NarzedzieGraficzne nie sa rozwizaniem za duo podklas i za mało rónic. Naley sparametryzowa NarzedzieGraficzne klas ObiektGraficzny.
Narzedzie Operacja() +prototyp Obiek tgraficzny Klonuj() Rysuj(pozycja) NarzedzieObracajace NarzedzieGraficzne Pieciolinia Klonuj() Rysuj(pozycja) Nuta p = prototyp->klonuj() while(uzytkownik prz eciaga myszka){ p->rysuj(nowa pozycja) } wstaw p do rysunku CalaNut a Klonuj() Rysuj(pozy cja) PolNut a Klonuj() Rysuj(pozycja) return kopia siebie samego return kopia siebie samego
Co wicej, mona zmniejszy tu ilo klas zamiast mie oddzielne klasy dla rónych rodzajów nut moemy mie jedn klas inicjowan rónymi bitmapami i okresami trwania. Łatwiej te wtedy dodawa nowe nuty nie trzeba tworzy dla nich nowych klas.
Stosowalno: niezaleno systemu od sposobu tworzenia produktów, składania ich oraz reprezentowania oraz klasy, których egzemplarze tworzymy s specyfikowane w czasie wykonania lub uniknicie budowania hierarchii klas fabryk (tyle co produktów) lub stan obiektów klasy moe przyjmowa tylko jedn z kilku wartoci; klonowanie rónie zainicjowanych prototypów Struktura:
Klient Operacja() +prot otyp Prototyp Klonuj() p = prototyp->klonuj() PrototypKonk ret ny1 Klonuj() PrototypKonkretny2 Klonuj() return kopia siebie samego return kopia siebie samego
Uczestnicy: Prototyp (ObiektGraficzny) deklaruje interfejs klonowania PrototypKonkretny (Piciolinia, CałaNuta) implementuje operacj klonowania si Klient (Narzdzie Graficzne) tworzy nowy obiekt proszc 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 wartoci
specyfikowanie nowych obiektów przez urozmaicanie struktury przykład podukładów elektronicznych zredukowana ilo podklas w porównaniu z FactoryMethod (#Tworca = #produkt); moemy nie mie hierarchii klasy Tworca dynamiczne konfigurowanie aplikacji za pomoc klas Główny problem wzorca to zapewnienie klonowania.
Implementacja: uywanie managera prototypów implementowanie operacji Klonuj() dyskusja kwestii kopii płytkich, głbokich, mieszanych, nawizanie do problemów z wzorcem Singleton (klonowanie i współbieno) inicjowanie klonów trudnoci 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 mona je łczy. Wzorzec AbstractFactory moe 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