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

_images/Builder.png

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

_images/Builder_dgr_sekwencji.png

Konsekwencje

  1. 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.

  2. 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.

  3. 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

  1. 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.

  2. 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

  1. Oddziela konstrukcję złożonych obiektów od ich reprezentacji.

  2. Ten sam proces konstrukcyjny może prowadzić do powstania obiektów o różnej reprezentacji.

  3. Jest często używany do budowania obiektów kompozytowych (wzorzec Composite).