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

Podobne dokumenty