Builder¶
Przeznaczenie
Oddziela konstrukcję złożonych obiektów od ich reprezentacji, umożliwiając tym samym powstawanie w jednym procesie konstrukcyjnym różnych reprezentacji
Definiuje etapy tworzenia obiektu-produktu. Etapy te są konfigurowalne z zewnątrz (to odróżnia go od fabryk obiektów)
Kontekst
Algorytm konstrukcji obiektu jest wielokrokowy
Proces konstrukcji złożonego obiektu prowadzi do utworzenia różnych reprezentacji obiektu
Problem
Chcemy zahermetyzować operacje niezbędne do stworzenia złożonego obiektu oraz ukryć wewnętrzną reprezentację produktu przed klientem
Chcemy mieć możliwość modyfikacji poszczególnych kroków algorytmu
Zastosowanie¶
Wzorca Builder należy używać, gdy:
Algorytm tworzenia obiektu złożonego powinien być niezależny od części składowych tego obiektu i sposobu ich zestawiania
Proces konstruowania musi uwzględniać różne reprezentacje konstruowanego obiektu
Struktura¶

Uczestnicy¶
Builder – określa interfejs do tworzenia części składowych obiektu Product (definiuje etapy)
ConcreteBuilder
konstruuje i zestawia części produktu poprzez implementowanie interfejsu Budowniczego
definiuje i kontroluje tworzoną przez siebie reprezentację
zapewnia interfejs do wyszukiwania produktu
Director – konstruuje obiekt, używając interfejsu Budowniczego
Product
reprezentuje konstruowany obiekt złożony
klasa ConcreteBuilder 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 zestawiania części w końcowy wynik
Współpraca¶
Klient tworzy obiekt kierownika (Director) i konfiguruje go przy pomocy pożądanego obiektu typu Builder
Kierownik informuje budowniczego (Builder) o potrzebie zbudowania części produktu
Budowniczy (Builder) przetwarza żądanie kierownika i dodaje części do produktu
Klient odbiera produkt od budowniczego

Konsekwencje¶
Umożliwia zmiany wewnętrznej reprezentacji produktu. Builder zapewnia kierownikowi interfejs do konstruowania produktu. Konstruowanie produktu odbywa się za pomocą abstrakcyjnego interfejsu – aby zmienić wewnętrzną reprezentację produktu, należy zdefiniować nowy rodzaj budowniczego.
Oddziela kod służący do konstruowania od reprezentacji. Poprawia modularyzację kodu poprzez kapsułkowanie sposobu, w jaki obiekt jest konstruowany – klienci nie muszą nic wiedzieć o klasach definiujących wewnętrzną strukturę produktu. Każda klasa ConcreteBuilder zawiera cały kod niezbędny do tworzenia i składania określonego rodzaju produktu.
Ulepsza kontrolę procesu konstruowania. W odróżnieniu od innych wzorców kreacyjnych, we wzorcu Builder obiekty konstruowane są krok po kroku pod nadzorem kierownika (Director). Proces konstrukcji może trwać w czasie. Dopiero po ukończeniu produktu kierownik (Director) odbiera go od budowniczego.
Implementacja¶
Interfejs montowania i konstruowania produktów. Interfejs Builder musi być na tyle ogólny, żeby było możliwe konstruowanie produktów przez wszystkich budowniczych konkretnych.
Brak klasy abstrakcyjnej produktów (nie jest wymagana).
Wzorce pokrewne¶
Abstract Factory - fabryka abstrakcyjna
podobnie jak Builder może konstruować obiekty złożone
różnica – wzorzec Builder kładzie nacisk na tworzenie produktów krok po kroku, a Abstract Factory kładzie nacisk na rodziny produktów
Podsumowanie¶
Oddziela konstrukcję złożonych obiektów od ich reprezentacji.
Ten sam proces konstrukcyjny może prowadzić do powstania obiektów o różnej reprezentacji.
Jest często używany do budowania obiektów kompozytowych (wzorzec Composite).