Design Pattern Singleton
Postado por xorna em November 30th, 2007 salvo em PHP, Padrões, Software LivrePadrões de Projeto descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos. Um padrão de projeto estabelece um nome e define o problema, a solução, quando aplicar esta solução e suas conseqüências.
Antes de iniciar a explicação desse Padrão de Projeto, explicarei como funcionam propriedades estáticas.
Propriedades Estáticas
Uma propriedade ou método estático, em programação, não siginifica nada mais do que algo que você pode acessar sem instanciar a classe, como no exemplo abaixo.
<?php
# Classe Pessoa
class pessoa{
# Quantidade de Instancias
# Estático, logo só existira u
static $instancias;
# Método Construtor
# A cada novo objeto Criado, ele incrementa no número de instancias
public function __construct(){
self::$instancias++;
}public function getInstancias(){
return $this->instancias;
}static function getEmpresa(){
return “TechPlugged Soluções Web”;
}
}print pessoa::getEmpresa().”<br />”;
$eu = new pessoa;
print pessoa::$instancias++;
?>
Agora que você entendeu como funciona o acesso a propriedades estáticas, vamos ao padrão em si. Algumas vezes, ao usarmos uma classe, precisamos criar apenas uma instancia da mesma, ou seja, precisamos de apenas um objeto para todas as partes desse programa, não importando quantas são. Um bom exemplo são as conexões com banco de dados, no qual precisamos ter apenas uma conexão para todas as operações, e será este o exemplo abordado neste pequeno tutorial. Utilizei o conceito de propriedade estática e um método chamado getInstancias, para implementar esse Padrão de Projeto.
<?php
# Classe Conexão
class conexao{
# Cria uma propriedade estática com valor nulo, que mudará quando for instanciado.
private static $instancia = null;# Construtor privado, para garantir o acesso somente dentro da classe
private function __construct(){
# aqui dentro escrevemos a conexão da melhor maneira possÃvel
}# Método Estático para pegar uma instancia da conexão
public static function pegaInstancia(){
# Se não existir nenhum instancia, criamos a conexão
if(self::$instancia == null){
self::$instancia = new conexao;
}
# Retorna a conexão
return self::$instancia;
}
}# Pegamos uma instancia da conexão
$con1 = conexao::pegaInstancia();# Pegamos outra instancia da mesma classe
$con2 = conexao::pegaInstancia();if($con1 === $con2){
print_r(”Nós temos dois objetos idênticos.”);
}?>
O resultado final é: “Nós temos dois objetos idênticos.”. Muito bem pessoal, esse foi o artigo, atrasado graças ao meu sócio que chutou meu pc fazendo assim que eu perdesse boa parte que reescrevi hoje. Estou escrevendo outros artigos acerca de Padrões de Projeto, não só em php mas em outras linguagens também.

November 30th, 2007 em 4:55 pm
Há quem diga que o Singleton é um antipattern, pois nada mais é que uma variável global “enrustida”!
O uso de injeção de depedências seria um melhor substituto para esse pattern.
Não sei se seria justificado uma refatoração de um código legado que utiliza singleton para começar a utilizar injeção de dependências, mas creio que quando for escrito código novo, esse ultimo é uma forma mais elegante de resolver o problema!
December 1st, 2007 em 8:18 am
Bem cara, eu li um pouco a respeito de Injeção de Dependências ou Inversão de Controle… Achei bastante Javista, talvez seja uma boa solução, mas talvez no php puro, não seria uma boa, pois nem um suporte completo em OO temos na versão corrente. No caso da conexão com o banco de dados, é uma ótima, pois no php puro, não tem como você trabalhar como java, vc precisa de include pra tudo, então nesse ponto nosso método estático não é Global nem de longe, só é global onde você requerir a classe, sendo assim, global no php, só com register_global ativado e declarando como global.