Série design patterns com PHP: II - Factory

PHP
Enviado por adlermedrado em Qua, 23/08/2006 - 22:56.PHP

Olá. Fiquei algum tempo sem postar nada aqui pois estive com alguns problemas pessoais que me consumiram muito tempo.
Porém, agora estou publicando o segundo artigo da série Design patterns com PHP, desta vez, o padrão Factory.

Quem não viu ou quer ver novamente o artigo sobre singleton, o encontrará aqui.

Eu espero conseguir postar novos artigos com maior regularidade. Bom, vamos ao que interessa.

O que é design pattern?
São formas de se escrever código de programação utilizando conceitos de melhores práticas de programação que visam mostrar soluções para problemas comuns no desenvolvimento de software.

O que é o factory?
Basicamente, o pattern factory consiste em uma fábrica de objetos de classes que implementam uma mesma interface e quando precisamos de uma instância de uma destas classes, a factory nos retorna este objeto de forma dinâmica.

Quais os pré-requisitos para se aproveitar melhor este artigo?
Conhecimento dos conceitos de programação orientada a objetos.
Conhecimentos das funcionalidades OO do PHP5.

Vou tentar tornar este artigo bastante prático, para isso iremos criar uma interface e algumas classes.

A interface abaixo será implementa por algumas classes posteriormente.

Porntanto, supondo que exista a interface IBanco:

  1.  
  2. Interface IBanco {
  3.     public function connect();
  4. }
  5.  

A interface IBanco define o método connect() que deverá ser comum a todas as classes que a implementarem.

Vamos agora, criar mais três classes:

A primeira será a classe BancoMysql que será responsável pela comunicação com o SGBDR mySQL, a segunda será a classe BancoPostgres, que será responsável pela comunicação com o SGBDR PostgreSQL e por fim, a classe BancoOracle, que se comunicará com o SGBDR ORACLE.

BancoMysql.php:

  1.  
  2. include_once ‘Ibanco.php’;
  3. class BancoMysql() implements IBanco {
  4.     public function connect() {
  5.         return new PDO('mysql:host=localhost;dbname=banco','root','');
  6.     }
  7. }
  8.  

BancoPostgres.php:

  1.  
  2. include_once ‘Ibanco.php’;
  3.  
  4. class BancoPostgres() implements IBanco {
  5.     public function connect() {
  6.         return new PDO('pgsql:host=localhost port=5432 dbname=banco user=username password=senha ');
  7.     }
  8. }
  9.  

BancoOracle.php:

  1.  
  2. include_once ‘Ibanco.php’;
  3. class BancoOracle() implements IBanco {
  4.     public function connect() {
  5.         return new PDO(’OCI:dbname=accounts;charset=UTF-8′, ‘username’, ’senha’‘);
  6.     }
  7. }
  8.  

Utilizamos a palavra reservada implements para informar que as classes acima implementam a interface IBanco.

Agora vamos criar a classe Factory que nos retornará um objeto de uma dessas classes sem que o usuário que está utilizando estas classes precise saber o nome real da classe.

Vejamos então a implementação desta classe:

  1.  
  2. include_once ‘BancoMysql.php’;
  3. include_once ‘BancoPostgres.php’;
  4. include_once ‘BancoOracle.php’;
  5.  
  6. class BancoFactory {
  7.  
  8.     public function factory($banco) {
  9.         switch ($banco) {
  10.         casemysql”:
  11.             return new BancoMysql();
  12.             break;
  13.         case “postgres”:
  14.             return new BancoMysql();
  15.             break;
  16.         case “oracle”:
  17.             return new BancoMysql();
  18.             break;
  19.         }
  20.     }
  21. }
  22.  

Na classe acima, de acordo com o parâmetro passado, é retornada uma instância de sua classe respectiva e se um dia houver uma mudança qualquer, por exemplo no nome da classe, você só precisará mudar em um lugar, na classe Factory.

Agora vamos executar esta classe:

  1.  
  2. include_once ‘BancoFactory.php’;
  3. $bancoFactory = new BancoFactory();
  4.  
  5. // Criando instância da classe BancoMysql
  6. $connMysql = $bancoFactory->factory(mysql);
  7. print_r($connMysql->connect());
  8.  
  9. // Criando instância da classe BancoPostgres
  10. $connPostgres = $bancoFactory->factory(“postgres”);
  11. print_r($connPostgres->connect());
  12.  
  13. // Criando instância da classe BancoOracle
  14. $connOracle = $bancoFactory->factory(“oracle”);
  15. print_r($connOracle->connect());
  16.  

Espero que este artigo tenha ajudado a esclarecer sobre o pattern Factory.

adler medrado
http://adler.neshertech.net
adler@neshertech.net

Referências:

PDO – Foi utilizado PDO para criar objetos referentes a cada banco.
http://www.php.net/pdo



Enviado por Anselmo (não verificado(a)) em Ter, 04/12/2007 - 08:30.

No caso a tua classe factory fez um case para identificar cada uma das classes do banco, com o php é possível usar o próprio parâmetro como nome da classe, exemplo:

<pre>
include_once ‘BancoMysql.php’;
include_once ‘BancoPostgres.php’;
include_once ‘BancoOracle.php’;
class BancoFactory {
public function factory($banco) {
return new $banco();
}
}
}
</pre>

Enviado por Rodrigo (não verificado(a)) em Qua, 29/04/2009 - 18:09.

Com includes fica bom e da p/ administrar legal. Agora, utilizando autoload para includes automaticos vira uma puta dor de cabeca usar metodos genericos para novas instancias e setters(no sentido de seguranca). Quanto ao artigo, ficou show, soh que existe um erro na instanciacao das classes, todos estao indicando para a classe do MYSQL.

Enviado por Marcelo Torres (não verificado(a)) em Dom, 02/08/2009 - 12:38.

hehehe

Acho que foi soh uma distração de digitação
Mas tomara que ele faça mais artigos com esse nível de clareza e didática

Ficou excelente, e da até para iniciantes entenderem.

Parabens!

Enviado por guest (não verificado(a)) em Qua, 21/10/2009 - 10:55.

Consegui ter uma visão melhor para usar as interfaces

Enviado por samuel_cazelli (não verificado(a)) em Seg, 16/11/2009 - 08:14.

Muito bom o tutorial, mas seria intereçande você explocar em que situação o factory é útil.