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!

Mais A função construtora não seria __construct()??
Gostaria de saber "mais" sobre extends , implements e interfaces!

Mais A função construtora não seria __construct()??
Gostaria de saber "mais" sobre extends , implements e interfaces!

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.

BOM REALMENTE DEVE HAVER OS INCLUDES DAS CLASSES UTILIZADAS, PEÇO DESCULPAS POR NAO TER POSTO OS INCLUDES
Responder comentário
EM RELACAO AO CONSTRUTOR PODE SER TANTO O CONSTRUCT COMO O NOME DA CLASSE OK.
Responder comentário
__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.
Responder comentário
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::"?
Responder comentário
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.
Responder comentário
cara ... pra que esses if's !?
da uma olhada
http://forum.imasters.com.br/index.php?showtopic=203626&hl=

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 ...

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

Da uma olhada no link.
http://nhaia.110mb.com/
Os textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
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.