Demonstração do padrão Builder

PHP
Enviado por Eclesiastes em Sex, 28/07/2006 - 23:19.PHP

Seguindo os conceitos do texto encontrado no site OODesing.com.br, onde há exemplos da aplicação do padrão (design pattern) criacional Builder nas linguagens C#, Delphi, Java e C++, resolvi criar também um demonstração em PHP, de acordo com o suporte OO do PHP5.

Para quem deseja conhecer a teoria e exemplos do padrão aqui fora citado, e entre outros ou até saber o que vem a ser design pattern, segue o link abaixo:
http://www.oodesign.com.br/patterns/

Seguindo o exemplo dado na linguagem C#. (C Sharp)
http://www.oodesign.com.br/patterns/Builder_Real.cs.html

No PHP5 ficaria da seguinte forma. (De acordo com o suporte)

  1. <?php
  2.  
  3.     # @ Autor: Felipe Nascimento Silva Pena (ecl) $
  4.     # @ E-mail: felipensp @ gmail . com           $
  5.  
  6.     class Fabrica
  7.     {
  8.         public function Construir ( $oVeiculo )
  9.         {
  10.             $oVeiculo->Iniciar();
  11.             $oVeiculo->construirPortas();
  12.             $oVeiculo->construirMotor();
  13.             $oVeiculo->construirPneus();
  14.         }
  15.     }
  16.  
  17.  
  18.     abstract class ConstrutorVeiculo
  19.     {
  20.         protected $Veiculo;
  21.        
  22.         abstract public function Iniciar();
  23.         abstract public function construirMotor();
  24.         abstract public function construirPortas();
  25.         abstract public function construirPneus();
  26.     }
  27.  
  28.  
  29.     class Carro extends ConstrutorVeiculo
  30.     {
  31.         public $Veiculo;
  32.    
  33.         public function Iniciar ( )
  34.         {
  35.             $this->Veiculo = new Veiculo('Carro');
  36.         }
  37.    
  38.         public function construirPortas ( )
  39.         {
  40.             $this->Veiculo->aPartes['Portas'] = 4;
  41.         }
  42.        
  43.         public function construirMotor ( )
  44.         {
  45.             $this->Veiculo->aPartes['Motor'] = 1;
  46.         }
  47.  
  48.         public function construirPneus ( )
  49.         {
  50.             $this->Veiculo->aPartes['Pneus'] = 4;
  51.         }
  52.     }
  53.  
  54.  
  55.     class Moto extends ConstrutorVeiculo
  56.     {
  57.         public $Veiculo;
  58.    
  59.         public function Iniciar ( )
  60.         {
  61.             $this->Veiculo = new Veiculo('Moto');
  62.         }
  63.    
  64.         public function construirPortas ( )
  65.         {
  66.             $this->Veiculo->aPartes['Portas'] = 0;
  67.         }
  68.        
  69.         public function construirMotor ( )
  70.         {
  71.             $this->Veiculo->aPartes['Motor'] = 1;
  72.         }
  73.        
  74.         public function construirPneus ( )
  75.         {
  76.             $this->Veiculo->aPartes['Pneus'] = 2;
  77.         }
  78.     }
  79.    
  80.    
  81.     class Veiculo
  82.     {
  83.         private $sTipo  = NULL;
  84.         public $aPartes = array();
  85.  
  86.         public function __construct ( $sTipo )
  87.         {
  88.             $this->sTipo = $sTipo;
  89.         }
  90.  
  91.         public function ObterInformacoes ( )
  92.         {
  93.             printf("--------------------------\n");
  94.             printf("Veículo: %s \n", $this->sTipo);
  95.             printf("Motor:   %s \n", $this->aPartes['Motor']);
  96.             printf("Portas:  %s \n", $this->aPartes['Portas']);
  97.             printf("Pneus:   %s \n", $this->aPartes['Pneus']);
  98.         }
  99.     }
  100.  
  101.  
  102.     $Fabrica  = new Fabrica;
  103.     $Carro    = new Carro;
  104.     $Moto     = new Moto;
  105.  
  106.     $Fabrica->Construir($Carro);
  107.  
  108.     $Carro->Veiculo->ObterInformacoes();
  109.  
  110.     $Fabrica->Construir($Moto);
  111.  
  112.     $Moto->Veiculo->ObterInformacoes();
  113.    
  114.  
  115. ?>

A saída seria a seguinte:
--------------------------
Veículo: Carro
Motor: 1
Portas: 4
Pneus: 4
--------------------------
Veículo: Moto
Motor: 1
Portas: 0
Pneus: 2