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.
Comments are closed