/**Ejemplo de diseño de patrón Builder*/
/**Clase Producto*/
class Pizza {
var $masa = null;
var $salsa = null;
var $relleno = null;
public function setMasa($masa){ $this->masa = $masa; }
public function setSalsa($salsa){ $this->salsa = $salsa; }
public function setRelleno($relleno){ $this->relleno = $relleno; }
public function mostrarComponentes(){
echo $this->masa." - ".$this->salsa." - ".$this->relleno."";
}
}
/** "Abstract Builder" */
abstract class PizzaBuilder {
var $pizza = null;
public function getPizza() { return $this->pizza; }
public function crearNuevaPizza() { $this->pizza = new Pizza(); }
public abstract function buildMasa();
public abstract function buildSalsa();
public abstract function buildRelleno();
}
/** "ConcreteBuilder" */
class PicantePizzaBuilder extends PizzaBuilder {
public function buildMasa(){ $this->pizza->setMasa("cocida"); }
public function buildSalsa(){ $this->pizza->setSalsa("picante"); }
public function buildRelleno(){
$this->pizza->setRelleno("pimienta+salchichón");
}
}
class HawaiPizzaBuilder extends PizzaBuilder {
public function buildMasa(){ $this->pizza->setMasa("suave"); }
public function buildSalsa(){ $this->pizza->setSalsa("dulce"); }
public function buildRelleno(){ $this->pizza->setRelleno("chorizo+alcachofas"); }
}
/** "Director" */
class Cocina {
var $pizzaBuilder;
public function setPizzaBuilder($pb){ $this->pizzaBuilder = $pb; }
public function getPizza(){ return $this->pizzaBuilder->getPizza(); }
public function construirPizza() {
$this->pizzaBuilder->crearNuevaPizza();
$this->pizzaBuilder->buildMasa();
$this->pizzaBuilder->buildSalsa();
$this->pizzaBuilder->buildRelleno();
}
}
/**Como se utilizaría*/
include('Cocina.php');
include('PicantePizzaBuilder.php');
include('HawaiPizzaBuilder.php');
$cocina = new Cocina();
$hawai_pizzabuilder = new HawaiPizzaBuilder();
$picante_pizzabuilder = new PicantePizzaBuilder();
$cocina->setPizzaBuilder($hawai_pizzabuilder );
$cocina->construirPizza();
$pizza = $cocina->getPizza();
$pizza->mostrarComponentes();
$cocina->setPizzaBuilder($picante_pizzabuilder );
$cocina->construirPizza();
$pizza = $cocina->getPizza();
$pizza->mostrarComponentes();