-
Permite a separação da construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes representações.
-
contém os seguintes elementos:
- director — constrói um objeto utilizando a interface do builder;
- builder — especifica uma interface para um construtor de partes do objeto-produto;
- concrete builder — define uma implementação da interface builder, mantém a representação que cria e fornece interface para recuperação do produto;
- product — o objeto complexo acabado de construir. Inclui classes que definem as partes constituintes.
-
Vantagens
- Permite variar a representação interna de um produto;
- Encapsula o código entre construção e representação;
- Provê controle durante o processo de construção.
-
Desvantagens
- Requer criar um concrete builder específico para cada instância diferente do produto.
-
<?php
/**
* Muito útil para criar objetos que passam por várias etapas
*/
class Character {
private $properties;
public function setProperty($pname, $pvalue){
$this->properties[$pname] = $pvalue;
}
public function getAllProperties(){
return $this->properties;
}
}
interface BuilderInterface {
public function createCharacter();
public function addHelmet();
public function addWeapon();
public function addBoots();
public function getCharacter();
}
class MarioBuilder implements BuilderInterface {
private $character;
public function createCharacter(){
$this->character = new Character();
};
public function addHelmet(){
$this->character->setProperty('helmet', 'red');
};
public function addWeapon(){
$this->character->setProperty('lefthand', 'cloves');
$this->character->setProperty('righhand', 'cloves');
};
public function addBoots(){
$this->character->setProperty('leftfoot', 'black boots');
$this->character->setProperty('rightfoot', 'black boots');
};
public function getCharacter(){
$return $this->character;
};
}
class Director {
public function build(BuilderInterface $builder){
$builder->createCharacter();
$builder->addHelmet();
$builder->addWeapon();
$builder->addBoots();
return $builder->getCharacter();
}
}
$mario = (new Director())->build(new MarioBuilder());
print_r($mario->getAllProperties());