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


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:

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 !

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


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

Anúncios

9 comentários sobre “Factory – Desgin Patterns para PHP (padrões de projetos) – Fábrica

  1. Falou tudo, o factory ou fábrica, como vc mesmo disse, é um pattern muito interessante quando queremos economizar o nosso sevidor.
    Fiquei sabendo há alguns dias o quanto um require/include pode deixar o nosso servidor mais lento.
    Então o quanto mais pudermos economizar de requires/includes, melhor.
    Já li em algum lugar que podiamos fazer todas as classes em apenas um arquivo, mas como isso ficaria muito embolado para um arquivo só, haveria separação em vários arquivos. Daí, quando prescisarmos de uma classe especifica, usamos o famoso require/include. O chato realmente é ter que chamar vários arquivos a toda hora, algumas vezes fazemos o chamamento achando que vamos usar e até usamos, mas decidimos trocar o código então aquela classe não é mais necessária, mas a chamada continua ali, fazendo um require no nosso servidor.
    O Object factory vem dar um novo ar aos usuários novos de PHP. Mas vamos esperar para ver como você resolverá o problema com o __autoload.

  2. Mas não é?!?

    Acho que o Factory veio pra salvar muita gente que não consegue programar em Classes…

    =P

    Afinal eu fui um… e hoje eu não vivo sem a minha Fabrica de Classes (xD)

    Mas ainda assim, vamos dar uma melhorada nisso… Vamos adiante…

    Saudações

  3. Pingback: Controladores de Interface Gráfica em PHP, procedimento para programar « UND3RW0LRD OF D3RF

  4. Odeio essa terminologia nerd da informática, quando ouvi esse termo tão suave e refinado, “factory”, sair da boca de um colega, achei que era coisa de outro mundo.

    Nada que o bom e velho _autoload() já não fizesse a muitos anos.

  5. Frederico, bela iniciativa, mas eu gostaria de ver este pattern, que muitos comentam, mas de uma forma bem simplista (assim como você), de uma forma realmente impressionante, inovadora.
    Pois bem, lá vai um exemplo:
    Digamos que eu tenha estas 3 classes que você mencionou, sendo que para cada uma delas, eu precise (durante a instanciação), atribuir valor a 5 variáveis de classe (valores estes que são passados através de constantes definidas no Index e por variáveis declaradas na camada de controle (modelo MVC).

    Além disso, mais um agravante, digamos que além de tudo isso, em algumas situações especiais, ainda na camada de controle, eu precise atribuir valores específicos para variáveis de cada uma das classes.

    Gostaria de ver o código final desta minha proposta para analisar se este padrão realmente funciona para grandes projetos.

    Abraços e belo post para iniciantes. –Felipe Hlibco

  6. Rapaz, verifica direito pois se por padrão o Factory é uma classe que cria objetos, não está errado não, estão bem parecido. Agora existem várias maneiras de implementar uma mesma função, mas a essência permanece !
    Obrigado pela dica !

  7. Cara, acabei de achar o seu blog e emboras já façam 4 anos que o artigo foi publicado, gostaria de deixar aqui minhas observações.

    Existe uma diferença entre o autoloader e o design pattern Factory Method. Para resolver os problemas citados em seu artigo, existe o autoloader. Instanciar classes sem ter que saber o seu lugar físico é papel do autoloader. O factory, emboras pareça fazer a mesma coisa, é um design pattern e seu objetivo é mais “arquitetônico” que funcional.

    Factory se utiliza quando quer instanciar um objeto de um tipo específico mas com funcionalidades diferentes. Um exemplo típico é o factory de pessoa.

    Vou montar um exemplo de perfil de usuario.

    Digamos que você está pegando dados de uma base sobre pessoas. Nessa base você tem informações sobre o sexo das pessoas. Se o sexo for masculino, você quer carregar a imagem da “fera” (fera.jpg) e mostrar a mensagem “Sou Homem!”. Se for feminina, mostra a imagem da “bela” (bela.jpg) e a mensagem “Sou Mulher””.

    Poderiamos ter as seguintes classes:

    class Pessoa {
    protected $imagem;
    protected $mensagem;

    public function get_imagem() {
    return $this->imagem;
    }

    public function get_mensagem() {
    return $this->mensagem;
    }

    class Homem extends Pessoa {
    public function __construct() {
    $this->imagem = ‘fera.jpg’;
    $this->mensagem = ‘Sou Homem!’;
    }
    }

    class Mulher extends Pessoa {
    public function __construct() {
    $this->imagem = ‘bela.jpg’;
    $this->mensagem = ‘Sou Mulher!’;
    }
    }

    class PessoaFactory {
    private function __construct() {} //evita a instancia dessa classe

    public static function get_pessoa($sexo) {
    switch($sexo) {
    case ‘masculino’ : return new Homem(); break;
    case ‘feminino’ : return new Mulher(); break;
    }
    }

    $pessoa = PessoaFactory::get_pessoa($banco_de_dados->get_sexo()); //sexo vem de uma base qualquer

    echo ‘get_imagem() . ‘” />’;
    echo ‘Mensagem: ‘ . $pessoa->get_mensagem();

    Assim conseguimos deixar a aplicação mais robusta, sem um if direto no dado que vem do banco. Assim, se surgir a necessidade de criar um novo tipo de pessoa, não precisamos alterar o if e ir sujando o código com a lógica. Apenas alteramos o código que cria o objeto, ou seja, PessoaFactory. Com isso o código fica muito melhor estruturado.

    Nessa história toda, o autoloader tem o papel de permitir que as classes dentro do factory sejam instanciadas sem a nececidade de fazer includes ali no switch.

    Abraços.

  8. No primeiro echo era para aparecer a tag imagem, mas o blog cortou. Então entendam que get_imagem está jogando a saida para o src da tag img.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s