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.