Sobes.tech
Middle+

Do czego służy wzorzec projektowy Builder?

sobes.tech AI

Odpowiedź od AI

Wzorzec Builder jest potrzebny do krokowego budowania złożonych obiektów. Pozwala oddzielić logikę tworzenia obiektu od jego reprezentacji.

Kluczowe zalety jego użycia:

  • Oddzielenie logiki: Proces tworzenia obiektu jest przeniesiony do osobnej klasy (budowniczy).
  • Elastyczność: Umożliwia tworzenie obiektów z różnymi zestawami opcji, używając tego samego budowniczego.
  • Czytelność kodu: Sekwencja tworzenia obiektu staje się bardziej przejrzysta.
  • Unikanie "konstruktorów teleskopowych": Zapobiega pojawianiu się dużej liczby przeciążonych konstruktorów z różną liczbą parametrów.

Przykład:

<?php
// Reprezentujemy złożony obiekt - samochód
class Car {
    private $engine;
    private $color;
    private $gps;

    public function setEngine($engine) {
        $this->engine = $engine;
    }

    public function setColor($color) {
        $this->color = $color;
    }

    public function setGps($gps) {
        $this->gps = $gps;
    }

    public function showDetails() {
        echo "Silnik: " . $this->engine . ", Kolor: " . $this->color . ", GPS: " . ($this->gps ? "Tak" : "Nie") . "\n";
    }
}

// Klasa budowniczy dla Car
class CarBuilder {
    private $car;

    public function __construct() {
        $this->car = new Car();
    }

    public function setEngine($engine) {
        $this->car->setEngine($engine);
        return $this; // Zwraca samego siebie do łańcuchowania wywołań
    }

    public function setColor($color) {
        $this->car->setColor($color);
        return $this;
    }

    public function setGps($gps) {
        $this->car->setGps($gps);
        return $this;
    }

    public function build() {
        return $this->car;
    }
}

// Użycie buildera
$builder = new CarBuilder();
$car1 = $builder->setEngine("V8")->setColor("Czerwony")->setGps(true)->build();
$car1->showDetails();

$car2 = (new CarBuilder())->setEngine("V6")->setColor("Niebieski")->build(); // Bez GPS
$car2->showDetails();

W tym przykładzie, CarBuilder jest budowniczym, który krok po kroku tworzy obiekt Car. Kod klienta komunikuje się tylko z budowniczym, nie znając szczegółów wewnętrznej struktury obiektu.