Olá. Fiquei algum tempo sem postar nada aqui relacionado a TI, pois estive com alguns problemas pessoais que me consumiram muito tempo. Porém, agora estou publicando o segundo artigo da séria 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:
Interface IBanco {
public function connect();
}
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:
include_once ‘Ibanco.php’;
class BancoMysql() implements IBanco {
public function connect() {
return new PDO('mysql:host=localhost;dbname=banco','root','');
}
}
BancoPostgres.php:
include_once ‘Ibanco.php’;
class BancoPostgres() implements IBanco {
public function connect() {
return new PDO('pgsql:host=localhost port=5432 dbname=banco user=username password=senha ');
}
}
BancoOracle.php:
include_once ‘Ibanco.php’;
class BancoOracle() implements IBanco {
public function connect() {
return new PDO(’OCI:dbname=accounts;charset=UTF-8′, ‘username’, ’senha’
‘);
}
}
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:
include_once ‘BancoMysql.php’;
include_once ‘BancoPostgres.php’;
include_once ‘BancoOracle.php’;
class BancoFactory {
public function factory($banco) {
switch ($banco) {
case “mysqlâ€:
return new BancoMysql();
break;
case “postgresâ€:
return new BancoMysql();
break;
case “oracleâ€:
return new BancoMysql();
break;
}
}
}
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:
include_once ‘BancoFactory.php’;
$bancoFactory = new BancoFactory();
// Criando instância da classe BancoMysql
$connMysql = $bancoFactory->factory(“mysqlâ€);
print_r($connMysql->connect());
// Criando instância da classe BancoPostgres
$connPostgres = $bancoFactory->factory(“postgresâ€);
print_r($connPostgres->connect());
// Criando instância da classe BancoOracle
$connOracle = $bancoFactory->factory(“oracleâ€);
print_r($connOracle->connect());
Espero que este artigo tenha ajudado a esclarecer sobre o pattern Factory.
Referências:
PDO – Foi utilizado PDO para criar objetos referentes a cada banco.
http://www.php.net/pdo