Middle+
Na co je užitečný vzor Builder?
sobes.tech AI
Odpověď od AI
Vzor Builder je potřeba pro krokové sestavení složitých objektů. Umožňuje oddělit logiku tvorby objektu od jeho prezentace.
Klíčové výhody jeho použití:
- Oddělení logiky: Proces tvorby objektu je přesunut do samostatné třídy (stavitel).
- Flexibilita: Umožňuje vytvářet objekty s různými sadami možností pomocí stejného stavitele.
- Čitelnost kódu: Sekvence tvorby objektu je jasnější.
- Vyvarování se "teleskopických konstruktorů": Zabraňuje vzniku velkého množství přetížených konstruktorů s různým počtem parametrů.
Příklad:
<?php
// Představujeme složitý objekt - auto
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 . ", Barva: " . $this->color . ", GPS: " . ($this->gps ? "Ano" : "Ne") . "\n";
}
}
// Třída stavitel pro Car
class CarBuilder {
private $car;
public function __construct() {
$this->car = new Car();
}
public function setEngine($engine) {
$this->car->setEngine($engine);
return $this; // Vrací sám sebe pro řetězení volání
}
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;
}
}
// Použití stavitele
$builder = new CarBuilder();
$car1 = $builder->setEngine("V8")->setColor("Červená")->setGps(true)->build();
$car1->showDetails();
$car2 = (new CarBuilder())->setEngine("V6")->setColor("Modrá")->build(); // Bez GPS
$car2->showDetails();
V tomto příkladu je CarBuilder stavitelem, který krok za krokem vytváří objekt Car. Klientský kód komunikuje pouze se stavitelem, nezná detaily vnitřní struktury objektu.