Zastanówmy się czym jest budownictwo. W potocznym tego słowa znaczeniu budowniczy jest to człowiek tworzący różne budowle.
W programowaniu oznacza to wzorzec umożliwiającą tworzenie różnych obiektów. Przykładem budowniczego może być człowiek tworzący domy składające się z kuchni, salonu, sypialni, łazienki, garażu czy ogrodu. Jednym z jego głównych założeń jest oddzielenie obiektu od procesu jego tworzenia

Wzorca budowniczy używamy głownie gdy:
– struktura projektu jest wielopoziomowa i rozbudowana
– uproszczenie projektu jest niemożliwe do zrealizowania
– obiekty będą budowane wielokrotnie


Przykładem może być Klasa samolot którą zaprezentuje poniżej

public class Samolot {
    private String silnik;
    private String skrzydla;
    private String podwozie;

    public void ustawSilnik(String silnik){

        this.silnik=silnik;

    }
    public void ustawSkrzydla(String skrzydla){

        this.skrzydla=skrzydla;
    }

    public void ustawPodwozie(String podwozie){
        this.podwozie=podwozie;

    }

    public String podajSilnik(){
        return silnik;

    }
    public String podajSkrzydla(){
        return skrzydla;
    }
    public String podajPodwozie(){
        return  podwozie;
    }


}

Jak możemy zaobserwować nasz uproszczony model samolotu zawiera trzy elementy:
– silnik
– skrzydła
-podwozie
Wprowadzono także gettery i settery do ustawiania danych.

Za pomocą interfejsu budowniczy zaprezentowanego poniżej stworzymy klasę BudowniczySamolotówBoeing.

public interface Budowniczy {
    void montujeSilnik();
    void montujeSkrzydla();
    void montujePodwozie();
}
public class BudowniczySamolotowBoeing implements Budowniczy{
    private Samolot samolot= new Samolot();

    @Override
    public void montujeSilnik() {
        samolot.ustawSilnik("Silnik Boeing");
    }

    @Override
    public void montujeSkrzydla() {
        samolot.ustawSkrzydla("Skrzydla Boeing");
    }

    @Override
    public void montujePodwozie() {
        samolot.ustawPodwozie("Podwozie Boeing");
    }


    public Samolot montazSamolotu(){
        System.out.println("\n"+ samolot.podajPodwozie()+ "\n"+ samolot.podajSilnik()+ "\n" + samolot.podajSkrzydla());
        System.out.println("\nNowy samolot jest gotowy");
        return samolot;
        
    }
}

Wraz z BudowniczymSamolotowBoeing implementujemy interferjs Budowniczy oraz tworzymy nowy obiekt samolot. Interfejs umożliwia zaimplementowanie metod:
– montujeSilnik
– montujeSkrzydla
– montujePodwozie
Jak wiadomo nad każdym budowniczym stoi kierownik budowy dlatego istotne jest wprowadzenie klasy która będzie kontrolować jego działania.
W danym przykładzie będzie to klasa SzefBudowniczych:

public class SzefBudowniczych {
    public void WykonajSamolot(Budowniczy konstruktor){
        konstruktor.montujePodwozie();
        konstruktor.montujeSilnik();
        konstruktor.montujeSkrzydla();
    }
}

Nadeszła pora na przetestowanie klas w naszym projekcie.

public class TestBudowy {
    public static void main(String[] args){
        SzefBudowniczych szefBudowniczych= new SzefBudowniczych();
        BudowniczySamolotowBoeing samolotBoeing= new BudowniczySamolotowBoeing();
        szefBudowniczych.WykonajSamolot(samolotBoeing);
        samolotBoeing.montazSamolotu();
    }
}

Wynik działania klasy jest następujący

Podwozie Boeing
Silnik Boeing
Skrzydla Boeing

Nowy samolot jest gotowy

Na początku tworzymy obiekt klasy szef budowniczych który odpowiada za nadzorowanie budowniczego. Kolejnym krokiem jest stworzenie obiektu samego budowniczego który następnie zostaje wywołany jako argument w metodzie wykonaj samolot. Na koniec metoda montaż samolotu wyświetla powyższe komunikaty.