Skip to content

Instantly share code, notes, and snippets.

@AlexGalhardo
Created August 22, 2019 20:00
Show Gist options
  • Select an option

  • Save AlexGalhardo/c3de97d8f0f978643c76e4e5bc363cd4 to your computer and use it in GitHub Desktop.

Select an option

Save AlexGalhardo/c3de97d8f0f978643c76e4e5bc363cd4 to your computer and use it in GitHub Desktop.
  • 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.
  • builder

Exemplo PHP

<?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());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment