terça-feira, 2 de outubro de 2012

Design Pattern Builder no PHP

Olá amigos tudo bem? Vamos "filosofar" um pouco? Vamos falar sobre o Builder um design pattern que "deriva" do Factory mas tem suas particularidades.

ANNTISiSS DE INICIAR O ARTIGO VOU DAR UM AVISO AOS NAVEGANTES:
    Não use um design pattern pq simplesmente ele é "elegante" ou então pq vc quer aprender e para isso vai jogar em código de produção para testar.
   Use os patterns quando vc REALMENTE PRECISAR, vou repetir... REALMENTE PRECISAR! Muitas vezes as pessoas tornam algo simples em algo absurdamente complexo por não saber usar ou usar os os patterns em hora errada, se vc tem dúvidas se usa ou não o pattern procure entender melhor o problema e a solução que ele propõe antes de fazer uma tremenda de uma porcaria no código. Ok? :)


Como o próprio nome já diz ele é um pattern construtor(builder), otimo para quando vc precisa criar objetos completos que atendam uma certa complexidade. No Pattern Builder um temos um diretor e um construtor trabalhando juntos para construir um objeto. O diretor controla a construção e especifica quais partes e variações entram em um objeto. O construtor sabe como montar a especificação do determinado objeto. Em resumo a intenção do padrão Construtor(Builder), é separar a construção de um objeto complexo, de modo que o mesmo processo de construção possa criar várias representações diferentes.

Veja um exemplo claro de diagrama mostrando a implementação:
O diagrama é a mesma coisa que dizer que:
A classe Builder especifica uma interface abstrata para a criação de partes de um objeto Product.
O ConcreteBuilder constrói e reúne peças do produto pela implementação da interface Builder. Ele define e mantém o controle da representação que cria e fornece uma interface para guardar o produto
A classe Director constrói o objeto complexo usando a interface do Construtor
A Product representa o objeto complexo que está sendo construído.

Veja um exemplo classico de implementação:
BUILDER
  1. <?php
  2. class Fabrica {
  3.     public function Construir($oVeiculo) {
  4.         $oVeiculo->Iniciar();
  5.         $oVeiculo->construirPortas();
  6.         $oVeiculo->construirMotor();
  7.         $oVeiculo->construirPneus();
  8.     }
  9. }
  10. abstract class ConstrutorVeiculo {
  11.     protected $Veiculo;
  12.     abstract public function Iniciar();
  13.     abstract public function construirMotor();
  14.     abstract public function construirPortas();
  15.     abstract public function construirPneus();
  16. }
  17. class Carro extends ConstrutorVeiculo {
  18.     public $Veiculo;
  19.     public function Iniciar() {
  20.         $this->Veiculo = new Veiculo('Carro');
  21.     }
  22.     public function construirPortas() {
  23.         $this->Veiculo->aPartes['Portas'] = 4;
  24.     }
  25.     public function construirMotor() {
  26.         $this->Veiculo->aPartes['Motor'] = 1;
  27.     }
  28.     public function construirPneus() {
  29.         $this->Veiculo->aPartes['Pneus'] = 4;
  30.     }
  31. }
  32. class Moto extends ConstrutorVeiculo {
  33.     public $Veiculo;
  34.     public function Iniciar() {
  35.         $this->Veiculo = new Veiculo('Moto');
  36.     }
  37.     public function construirPortas() {
  38.         $this->Veiculo->aPartes['Portas'] = 0;
  39.     }
  40.     public function construirMotor() {
  41.         $this->Veiculo->aPartes['Motor'] = 1;
  42.     }
  43.     public function construirPneus() {
  44.         $this->Veiculo->aPartes['Pneus'] = 2;
  45.     }
  46. }
  47. class Veiculo {
  48.     private $sTipo = NULL;
  49.     public $aPartes = array();
  50.     public function __construct($sTipo) {
  51.         $this->sTipo = $sTipo;
  52.     }
  53.     public function ObterInformacoes() {
  54.         printf("--------------------------\n");
  55.         printf("Veículo: %s \n", $this->sTipo);
  56.         printf("Motor:   %s \n", $this->aPartes['Motor']);
  57.         printf("Portas:  %s \n", $this->aPartes['Portas']);
  58.         printf("Pneus:   %s \n", $this->aPartes['Pneus']);
  59.     }
  60. }
  61. $Fabrica = new Fabrica;
  62. $Carro = new Carro;
  63. $Moto = new Moto;
  64. $Fabrica->Construir($Carro);
  65. $Carro->Veiculo->ObterInformacoes();
  66. $Fabrica->Construir($Moto);
  67. $Moto->Veiculo->ObterInformacoes();
  68. ?>


A explicação acima fala por si só não é? Mesmo assim qualquer dúvida... Fui

Um comentário:

  1. Olá,

    Gostaria de saber se as aulas de Site com HTML5,css e jquery acabara na terceira aula mesmo? Aguardo resposta.

    ResponderExcluir