Builder jest jednym z kreacyjnych wzorców projektowych. Jednakże w porównaniu do poprzedniego wzorca jakim jest Fabryka, logika jego działania jest nieco inna. Poprzez poszczególne wywołania wyspecyfikowanych metod tworzymy nową instancję zawierającą coraz bardziej rozbudowaną wersję klasy złożoną jakby z pasujących do siebie klocków lego. Można użyć porównania ze StackOverflow, gdzie przyrównano wzorzec Budowniczego do pizzerii, gdzie zamawiając posiłek podajesz listę swoich ulubionych składników. W rezultacie otrzymujesz oczekiwany posiłek, takim jakim go chciałeś spożyć w tej chwili. Dla odmiany wzorzec Fabryki jest utożsamiany z zamówieniem “Posiłku dnia”, gdzie z wielu dostępnych w menu pozycji to kucharz określa, który jest dziś owym posiłkiem dnia.
Użycie…
Idąc za ciosem i przykładem ze wspomnianego źródła, użycie tego wzorca może wyglądać następująco. Rozważmy poniższą definicję klasy dla powiązania ze wzorcem nazwanej BuilderService:
package wzorceprojektowe1; public class BuilderService { private int size; private boolean cheese; private boolean pepperoni; private boolean bacon; public static class Builder { //required private final int size; //optional private boolean cheese = false; private boolean pepperoni = false; private boolean bacon = false; public Builder(int size) { this.size = size; } public Builder cheese(boolean value) { cheese = value; return this; } public Builder pepperoni(boolean value) { pepperoni = value; return this; } public Builder bacon(boolean value) { bacon = value; return this; } public BuilderService build() { return new BuilderService(this); } } private BuilderService(Builder builder) { size = builder.size; cheese = builder.cheese; pepperoni = builder.pepperoni; bacon = builder.bacon; } public String ingredients() { return "Size "+size+" cheese "+(cheese?"Y":"N")+" pepperoni "+(pepperoni?"Y":"N")+" bacon "+(bacon?"Y":"N"); } }
A teraz zobaczmy jak prosto zlinkować (stackUp) wszystkie niezbędne składniki tego dania i użyć w praktyce w programie:
BuilderService pizza = new BuilderService.Builder(12) .cheese(true) .pepperoni(true) .bacon(true) .build(); System.out.println(pizza.ingredients());
W rezultacie otrzymaliśmy obiekt zawierający niezbędne informacje o oczekiwanym rezultacie i przygotowane w czytelny, prosty do rozbudowy sposób.
Zadanie: Przygotuj prosty program obsługi pizzerii z wykorzystaniem wzorca, gdzie zamawiający będzie mógł skomponować własną pizzę, a w rezultacie każde zamówienie będzie miało swój indywidualny numer, datę złożenia oraz skład.
Zastanów się nad programem obsługi restauracji… czy ten wzorzec jest odpowiedni, czy zaproponujesz inne rozwiązanie. Swoje rozważania i propozycję przelej na sprawozdanie z tematu.