Factory Method (PHP5)
por Felipe Lunardi Farias

Este é um tipo bem comum de padrão utilizado nos programas orientados
ao objeto. O padrão Factory Method é caracterizado por retornar uma
instância dentre muitas possíveis classes, dependendo dos dados
providos a ele.

Quem programa em JAVA já deve ter se deparado com esse método.

Vamos considerar um caso simples onde nós podemos usar uma classe
Factory. Suponha que nós temos um sistema de consulta de preços de
veículos. Informamos qual carro queremos consultar o preço, então a
classe factory nos retorna uma instância dele e então consultamos o
preço.

Note que poderiamos certamente passar a váriavel $Carro via um simples formulário HTML.

Vamos, então, dar uma olhada na implementação:




<?php


/** 
Essa é nossa classe "abstrata". Note que uma classes abstratas não pode ser instanciada, ou seja, não há objatos que possam ser construídos diretamente de sua definição.
Classes abstratas deverão ser concretizadas em classes derivadas.
*/ 
Abstract Class Carro 

    
/** 
    A palavra-chave protected restringe a visibilidade do membro modificado, atributo ou     
    método, de forma que classes não-relacionadas não possam acessá-lo. Objetos da própria  
    classe, de classes derivadas desta.
    */          
    
protected $valor;

    
public function getPreco() {
        return 
$this->valor;
    }
}

// Classes que herdam caracteristicas da classe pai.
Class Vectra extends Carro {
    
public function Vectra() {
        return 
$this->valor 30000;
    }
}

Class 
Omega extends Carro {
    
public function Omega() {
        return 
$this->valor 50000;
    }
}

Class 
Golf extends Carro {
    
public function Golf() {
        return 
$this->valor 35000;
    }
}    

Class 
Gol extends Carro {
    
public function Gol() {
        return 
$this->valor 20000;
    }
}



//Note que uma classe definida como final não pode ser extendida.

Final Class CarroFactory {

    
public static function GetCarro ($TCarro){
    If (!
$TCarro)
        return 
null;
    else if( 
$TCarro=="Vectra" 
        return new 
Vectra();
    else if( 
$TCarro=="Omega" )  
        return new 
Omega();
    else if( 
$TCarro=="Golf" )   
        return new 
golf();
    else if( 
$TCarro=="Gol" )    
        return new 
gol();
    }
}


$Carro "Gol";
print 
$Carro." - R$ " . ( CarroFactory::GetCarro($Carro)->getPreco() );

/** Veja que não precisamos utilizar nesse exemplo FACTORY um construtor!
Obs: Construtor - > é apenas invocado no momento da criação do objeto através do operador new.
*/ 

?>