Factory - Desgin Patterns para PHP (padrões de projetos) - Fábrica

Started by d3rf, 09 de October , 2007, 10:46:27 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

d3rf

Bem, já ouvi muito blá-blá-blá sobre isso, mas nenhum exemplo bom ou prático, então resolvi fazer o meu e explicar ... vamos lá

 Hoje nós vamos falar sobre Factory (fábrica), q nada mais é que uma fábrica de objetos...

Exemplo sem Factory:

view plaincopy to clipboardprint
require_once("classe1.php");   
require_once("classe2.php");   
require_once("classe3.php");   
....   
 
$obj1 = new Classe1();   
$obj2 = new Classe2();   
$obj3 = new Classe3(); 
require_once("classe1.php");
require_once("classe2.php");
require_once("classe3.php");
....

$obj1 = new Classe1();
$obj2 = new Classe2();
$obj3 = new Classe3();
Bem, como deu para reparar, voce faz os requires de todas as classes que vc quer, e depois cria o objeto de cada uma delas ... agora vamos implentar o factory !

view plaincopy to clipboardprint
require_once("fabrica.php");   
$fab = new Fabrica();   
$obj1 = $fab->getObjetoClasse1();//Pega objeto da classe1   
$obj2 = $fab->getObjetoClasse2();//Pega objeto da classe2   
$obj3 = $fab->getObjetoClasse3();//Pega objeto da classe3 
require_once("fabrica.php");
$fab = new Fabrica();
$obj1 = $fab->getObjetoClasse1();//Pega objeto da classe1
$obj2 = $fab->getObjetoClasse2();//Pega objeto da classe2
$obj3 = $fab->getObjetoClasse3();//Pega objeto da classe3
Como pode-se ver, criou-se uma camada que vai interagir com todos os objetos, assim sendo, ao invés de vc na suas páginas gerar um monte de requires(se tiver erro em um, para tudo), vc só faz o require para a fábrica e deixa que ela cuida do resto ...

Agora como ficaria a fábrica

view plaincopy to clipboardprint
 
class Fabrica{   
 
public function __construct(){   
 
}   
public function getObjetoClasse1(){   
require_once("classe1.php");   
return $obj1 = new Classe1();   
}   
public function getObjetoClasse2(){   
require_once("classe2.php");   
return $obj2 = new Classe2();   
}   
public function getObjetoClasse3(){   
require_once("classe3.php");   
return $obj1 = new Classe3();   
}   
 


class Fabrica{

public function __construct(){

}
public function getObjetoClasse1(){
require_once("classe1.php");
return $obj1 = new Classe1();
}
public function getObjetoClasse2(){
require_once("classe2.php");
return $obj2 = new Classe2();
}
public function getObjetoClasse3(){
require_once("classe3.php");
return $obj1 = new Classe3();
}

}
Bem isso é a maneira mais simples, fica bem melhor de entender o código e de programar...

Agora para aperfeiçoar, pode se usar um metódo que receba uma string dizendo o nome da classe, faz-se um switch e pronto, ou usa-se a função nativa do PHP _autoload e por ae vai ...

No próximo vamos falar sobre singleton atrelado ao Factory

Wuefez



"Quem fala não faz."

shake

Cara interessante...
Porém surgiu uma dúvida,
Qual a necessidade de se repetir os comandos!?

Ex:
view plaincopy to clipboardprint
require_once("fabrica.php");   
$fab = new Fabrica();   
$obj1 = $fab->getObjetoClasse1();//Pega objeto da classe1   
$obj2 = $fab->getObjetoClasse2();//Pega objeto da classe2   
$obj3 = $fab->getObjetoClasse3();//Pega objeto da classe3
require_once("fabrica.php");
$fab = new Fabrica();
$obj1 = $fab->getObjetoClasse1();//Pega objeto da classe1
$obj2 = $fab->getObjetoClasse2();//Pega objeto da classe2
$obj3 = $fab->getObjetoClasse3();//Pega objeto da classe3

d3rf

Ixi, foi na hora de colar ... para ver direitinho acessa meu blog, que inclusive tem o singleton tb ...http://d3rf.wordpress.com/2007/09/27/de ... -projetos/
Quote from: "shake"Cara interessante...
Porém surgiu uma dúvida,
Qual a necessidade de se repetir os comandos!?

Ex:
view plaincopy to clipboardprint
require_once("fabrica.php");  
$fab = new Fabrica();  
$obj1 = $fab->getObjetoClasse1();//Pega objeto da classe1  
$obj2 = $fab->getObjetoClasse2();//Pega objeto da classe2  
$obj3 = $fab->getObjetoClasse3();//Pega objeto da classe3
require_once("fabrica.php");
$fab = new Fabrica();
$obj1 = $fab->getObjetoClasse1();//Pega objeto da classe1
$obj2 = $fab->getObjetoClasse2();//Pega objeto da classe2
$obj3 = $fab->getObjetoClasse3();//Pega objeto da classe3