Sobes.tech
Middle+

Mire való a Builder tervezési minta?

sobes.tech MI

Válasz az MI-től

A Builder minta szükséges összetett objektumok lépésről lépésre történő felépítéséhez. Lehetővé teszi az objektum létrehozásának logikájának elkülönítését a megjelenítésétől.

A használatának fő előnyei:

  • Logika elkülönítése: Az objektum létrehozási folyamata külön osztályba (építő) kerül.
  • Rugalmasság: Lehetővé teszi különböző opciókészletekkel rendelkező objektumok létrehozását ugyanazzal az építővel.
  • Kód olvashatósága: Az objektum létrehozási sorrendje világosabbá válik.
  • "Teleszkópos konstruktorok" elkerülése: Megakadályozza, hogy sok túlterhelt konstruktor alakuljon ki különböző paraméterszámokkal.

Példa:

<?php
// Összetett objektum - egy autó
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 "Motor: " . $this->engine . ", Szín: " . $this->color . ", GPS: " . ($this->gps ? "Igen" : "Nem") . "\n";
    }
}

// Builder osztály az autóhoz
class CarBuilder {
    private $car;

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

    public function setEngine($engine) {
        $this->car->setEngine($engine);
        return $this; // Saját magát adja vissza láncoláshoz
    }

    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;
    }
}

// A builder használata
$builder = new CarBuilder();
$car1 = $builder->setEngine("V8")->setColor("Piros")->setGps(true)->build();
$car1->showDetails();

$car2 = (new CarBuilder())->setEngine("V6")->setColor("Kék")->build(); // GPS nélkül
$car2->showDetails();

Ebben a példában a CarBuilder lépésről lépésre építi fel a Car objektumot. A kliens kód csak a builderrel kommunikál, nem ismeri az objektum belső szerkezetét.