Treinamento Online
Sexta-feira, 29 de dezembro de 2006 às 10h31

Construindo uma Fábrica de Dao's

Faltam -1 dias! Inscreva-se agora! O maior encontro de profissionais web da américa latina.

Iremos entender alguns padrões de desenvolvimento e um exemplo prático. Para isso, é necessário que você possua algum conhecimento em Orientação a Objeto.

DaoFactory

Imagine um sistema que trabalhe com a Desing Patter DAO (Data Access Object) e tenha muitas Dao's para serem tratadas. Vamos organizar a chamada desses métodos com o padrão Factory. Esse padrão serve para tratar objetos que tem a mesma funcionalidade, tornando assim o ponto de chamada único. Ou seja, todos esses objetos serão chamados em apenas um ponto, assim a classe comunicadora desses objetos ficará mais limpa, ganhando em organização.

Agora, como a nossa classe DaoFactory será chamada muitas vezes no aplicativo, não podemos criá-la toda hora, pois senão perdemos em performance. Ai que entra mais uma nova Pattern. A Singleton nada mais é do que a garantia que existirá somente uma instância da classe possuidora desse padrão, assim não criando muitas instâncias do objeto.

Códigos

Inicialmente vamos criar nossas Dao's

CargoDao.class.php

<?php
class CargoDao {
  public function CargoDao() {
    print "CargoDao";
  }
}
?>

FuncionarioDao.class.php

<?php
class FuncionarioDao {
  public function FuncionarioDao() {
    print "FuncionarioDao";
  }
}
?>

Pronto. Com as nossas Dao's criadas, construiremos a nossa Fábrica de Dao. Quem quiser usar uma Dao, terá que chamá-la pela DaoFactory.

DaoFactory.class.php

<?php
class DaoFactoryDao {
  private static $daoFactory;

  private function DaoFactory() {
  }
  public function getInstance() {
    if(!isset(self::$daoFactory())) {
      self::$daoFactory = new DaoFactory();
    }
    return self::$daoFactory;
  }
  public function getDao($dao) {
    if($dao == "CargoDao") {
    return new CargoDao();
    }
    if($dao == "FuncionarioDao") {
    return new FuncionarioDao();
    }
  }

}
?>

Entendendo

Se eu quiser instanciar a classe FuncionarioDao, tenho que usar a DaoFactory. A idéia é centralizar em um ponto a chamada das Dao's.
Tenho uma variável estática que é verificada se já está com a instância da DaoFactory. Caso não esteje, é retornada uma nova instância.

O construtor é privado para que a classe somente seja instanciada na verificação. Esse é o padrão Singleton.

O método getDao retorna a Dao requisitada, padrão Factory, verificando o nome passado.

Bom, é isso. Espero ter ajudado para o aumento de conhecimento com esse artigo. Abraços!

12 comentários

 Sadjow Medeiros Leão
29/12/2006 11h43

Muito bom!

Mais A função construtora não seria __construct()??

Gostaria de saber "mais" sobre extends , implements e interfaces!

 Sadjow Medeiros Leão
29/12/2006 11h43

Muito bom!

Mais A função construtora não seria __construct()??

Gostaria de saber "mais" sobre extends , implements e interfaces!

 Rafael Capucho
29/12/2006 13h22

MAS...

Só não entendi uma coisa na página DaoFactory.class.php não deveriam haver os includes, das outras 2?

é possivel criar um Objeto, sem dar os includes referentes?

espero respostas, abraços.

 Rogério Rodrigues
29/12/2006 14h59

RESPOSTA

BOM REALMENTE DEVE HAVER OS INCLUDES DAS CLASSES UTILIZADAS, PEÇO DESCULPAS POR NAO TER POSTO OS INCLUDES

 Rogério Rodrigues
29/12/2006 15h00

RESPOSTA

EM RELACAO AO CONSTRUTOR PODE SER TANTO O CONSTRUCT COMO O NOME DA CLASSE OK.

 Antonio Josué de Lima Neto
01/01/2007 18h47

muito bom

__construct() so foi implmentado a partir do php5 ... muito bom o artigo, seria sempre bom mostrar o uso dos padrões de projeto com php.

 Alisson Douglas
02/01/2007 07h54

self::$daoFactory()

Em primeiro lugar gostei muito da materia, mas ficou uma duvida, na linha "self::$daoFactory()", não entendi o que exatamente essa linha faz e qual a função do "self::"?

 Rogério Rodrigues
02/01/2007 10h47

RESPOSTA

O SELF É O SEGUINTE, VEJA QUE EU TENHO MINHA VARIAVEL QUE É A PROPRIA INSTANCIA QUE VOU RETORNAR, EU ME REFIRO A ELA COM O SELF, MEIO QUE SE COMPARA COM O $THIS OK.

 Luis Felipe S. Silva
03/01/2007 08h13

uhnm ...

cara ... pra que esses if's !?

da uma olhada
http://forum.imasters.com.br/index.php?showtopic=203626&hl=

 Luis Felipe S. Silva
03/01/2007 08h16

em resposta a dúvida dos includes

Em resposta a dúvida dos includes de arquivos ...
Não é necessário, se voce utilizar a função mágica autoload, seguindo um padrão de nome de classes ...

 Jáder Tavares - Cogitto Agência Digital
28/03/2007 11h00

Sugestão

Acredito que usando interfaces para determinas os métodos de uma implementação será muito melhor, separar o que são métodos e atributos.
Em relação aos DAOs, seria então mais fácil criar uma classe static, com os métodos static tb, para que não seja necessário instalar um DAO, além de colocar o tipo de retorno da função DAO a interface, fazendo com que qualquer implementação daquela interface possa retornada.

Isso tudo para que se possa usar o DAOFactory da seguinte maneira

DAOFactory.nomeDoFactory().nomeMetodo(parâmetros);

Qualquer coisa só comentar ae, flwww

 Paulo Nhaia
30/03/2007 13h02

Exemplos de DAO

Da uma olhada no link.
http://nhaia.110mb.com/

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Rogério Rodrigues trabalha com Desenvolvimento de Sistemas, Modelagem de Dados, Programação em PHP e Java na Agência Espacial Brasileira. Faz bacharelado em Ciência da Computação, desenvolve trabalhos free-lancer para vários tipos de serviços Web.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.