Budowniczy (wzorzec projektowy)
Budowniczy (ang. Builder) – kreacyjny wzorzec projektowy, którego celem jest rozdzielenie sposobu tworzenia obiektów od ich reprezentacji. Innymi słowy proces tworzenia obiektu podzielony jest na kilka mniejszych etapów a każdy z tych etapów może być implementowany na wiele sposobów. Dzięki takiemu rozwiązaniu możliwe jest tworzenie różnych reprezentacji obiektów w tym samym procesie konstrukcyjnym[1][2]: sposób tworzenia obiektów zamknięty jest w oddzielnych obiektach zwanych Konkretnymi Budowniczymi[3]. Zazwyczaj stosowany jest do konstrukcji obiektów złożonych, których konfiguracja i inicjalizacja jest procesem wieloetapowym. Budowniczy różni się od wzorca fabryki abstrakcyjnej oraz pozostałych wzorców kreacyjnych tym, że skupia się na sposobie tworzenia obiektów reprezentujących produkty. Tworzy drobną część skomplikowanego produktu za każdym swoim wywołaniem jednocześnie kontrolując stan wykonanej pracy. Klient otrzymuje produkt po zakończeniu jego pracy, a nie – tak jak w przypadku Fabryki abstrakcyjnej – bezzwłocznie. W przypadku Fabryki abstrakcyjnej możliwe jest także tworzenie kilku obiektów jednocześnie. Często oba wzorce są łączone[1][4]. Należy do grupy wzorców skatalogowanych przez Gang czworga.
Przykłady zastosowania
[edytuj | edytuj kod]Wzorzec budowniczego stosowany jest do oddzielenia sposobu tworzenia obiektów od tego jak te obiekty mają wyglądać. Przykładem jest oprogramowanie konwertujące tekst z jednego formatu na drugi. Algorytm odczytujący i interpretujący dane wejściowe jest oddzielony od algorytmu tworzącego dane wyjściowe. Dzięki takiemu rozwiązaniu możliwe jest zastosowanie jednego obiektu odczytującego dane wejściowe oraz wielu obiektów konwertujących odczytane dane do różnych formatów (ASCII, HTML, RTF, itp.), co zwiększa uniwersalność rozwiązania[1].
Różne warianty omawianego wzorca wykorzystywane są w bibliotece MFC, implementując architekturę dokument/widok[5]. Obiekt klasy CDocument oraz jego podobiekty tworzone są poprzez wywołanie metody tworzącej z trzema parametrami typu CRuntimeClass. Klasa ta zawiera metodę CreateObject, umożliwiającą jej tworzenie obiektów różnych klas (m.in. CDocument, CFrameWnd oraz CView). Dzięki takiemu zachowaniu CRuntimeClass może być nazwana klasą Budowniczego.
Budowa
[edytuj | edytuj kod]![](http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Builder_classes_pl.svg/335px-Builder_classes_pl.svg.png)
Standardowo wzorzec składa się z dwóch podstawowych obiektów. Pierwszy z nich oznaczony jest jako Budowniczy – jego celem jest dostarczenie interfejsu do tworzenia obiektów nazywanych w tym kontekście produktami[1][4]. Drugim obiektem jest obiekt oznaczony jako Konkretny Budowniczy, a jego celem jest tworzenie konkretnych reprezentacji produktów przy pomocy zaimplementowanego interfejsu Budowniczego. W Konkretnym Budowniczym zawarte są procedury odpowiedzialne za konstrukcje i inicjalizację obiektu. Strukturę wzorca uzupełnia obiekt Kierownika (czasami nazywany także Dyrektorem, Nadzorcą), który zleca konstrukcję produktów poprzez obiekt Budowniczego dbając o to, aby proces konstrukcyjny przebiegał w odpowiedniej kolejności.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Builder_sequence_pl.svg/335px-Builder_sequence_pl.svg.png)
Dokładny przebieg procesu budowania przedstawia znajdujący się obok diagram sekwencji:
- klient używający wzorca konstruuje obiekt budowniczego,
- klient konstruuje nadzorcę, przekazując mu referencję do obiektu budowniczego, z którego ma korzystać,
- klient zleca skonstruowanie produktu,
- nadzorca zleca budowniczemu wykonanie w odpowiedniej kolejności wszystkich czynności niezbędnych do stworzenia produktu,
- klient pobiera gotowy produkt od budowniczego.
Konsekwencje stosowania
[edytuj | edytuj kod]Zaletami stosowania wzorca są: duża możliwość zróżnicowania wewnętrznych struktur klas, większa możliwość kontrolowania tego, w jaki sposób tworzony jest obiekt (proces konstrukcyjny jest niezależny od elementów, z których składa się tworzony obiekt[1][3]) oraz duża skalowalność (dodawanie nowych reprezentacji obiektów jest uproszczone[3]). Stosowanie wzorca zapobiega także tworzeniu zduplikowanego kodu odpowiedzialnego za tworzenie obiektów, gdyż proces tworzenia konkretnych elementów obiektów zamknięty jest w poszczególnych procedurach[4]. Wady to duża liczba obiektów reprezentujących konkretne produkty.
Podobne wzorce
[edytuj | edytuj kod]Wzorcem podobnym do Budowniczego jest fabryka abstrakcyjna, której celem jest tworzenie grupy produktów. Wzorzec Budowniczego często jest także stosowany do tworzenia obiektów we wzorcu kompozyt[1]. Inne podobne wzorce to metoda wytwórcza oraz metoda szablonowa[4].
Przykłady
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]- ↑ a b c d e f Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Inżynieria oprogramowania: Wzorce projektowe (Wyd. II). Warszawa: WNT, 2008, s. 95–105. ISBN 978-83-204-3472-9.
- ↑ Opis wzorca na stronie DoFactory.com. [dostęp 2012-06-10]. [zarchiwizowane z tego adresu (2012-06-09)]. (ang.).
- ↑ a b c Partha Kuchana: Software Architecture Design Patterns in Java. CRC Press, 2004, s. 514. ISBN 978-0-8493-2142-9.
- ↑ a b c d Christopher G. Lasater: Design Patterns. Wordware Publishing, 2007, s. 302. ISBN 978-1-59822-031-5.
- ↑ Opis architektury dokument/view na stronie msdn. Microsoft. [dostęp 2012-06-10]. (ang.).
Linki zewnętrzne
[edytuj | edytuj kod]- Szczegółowy opis wzorca wraz z przykładami
- Opis wzorca na stronie JavaDzone. java.dzone.com. [zarchiwizowane z tego adresu (2009-03-07)].