Sobes.tech
Middle+

Para que serve o padrão de projeto Builder?

sobes.tech IA

Resposta da IA

O padrão Builder é necessário para construir objetos complexos passo a passo. Permite separar a lógica de criação do objeto da sua representação.

As principais vantagens do seu uso:

  • Separação de lógica: O processo de criação do objeto é realizado numa classe separada (construtor).
  • Flexibilidade: Permite criar objetos com diferentes conjuntos de opções, usando o mesmo construtor.
  • Legibilidade do código: A sequência de criação do objeto torna-se mais clara.
  • Evitar "construtores telescópicos": Previne a aparição de muitos construtores sobrecarregados com diferentes números de parâmetros.

Exemplo:

<?php
// Representamos um objeto complexo - um carro
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 . ", Cor: " . $this->color . ", GPS: " . ($this->gps ? "Sim" : "Não") . "\n";
    }
}

// Classe construtora para Car
class CarBuilder {
    private $car;

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

    public function setEngine($engine) {
        $this->car->setEngine($engine);
        return $this; // Retorna a si próprio para encadear chamadas
    }

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

// Uso do construtor
$builder = new CarBuilder();
$car1 = $builder->setEngine("V8")->setColor("Vermelho")->setGps(true)->build();
$car1->showDetails();

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

Neste exemplo, CarBuilder é o construtor que constrói passo a passo um objeto Car. O código cliente interage apenas com o construtor, sem conhecer os detalhes internos da estrutura do objeto.