O Design Pattern Singleton, na prática
Este artigo não tem como objetivo explicar Design Patterns em detalhes mas sim explicar brevemente o já conhecidíssimo Singleton Pattern e, principalmente, examinar o seu comportamento na prática e apresentar uma solução para um problema que pode ocorrer.
Se você já conheçe o Singleton pode pular para a próxima página!
Prazer, Singleton
Bem resumidamente, o Singleton é o padrão de programação que resolve o a situação na qual é necessário que exista, em qualquer momento, no máximo uma instância de uma devida classe. Várias literaturas do assunto apresentam o exemplo de uma classe de acesso a banco de dados: temos uma classe que é responsável por todas as operações de banco de dados e, para evitar problemas que possam surgir com múltiplas conexões, é necessário que exista somente uma instância do objeto. Outro exemplo muito comum é o de um mecanismo de log que atualiza um arquivo xml ou qualquer outro. Novamente, podem ocorrer erros se tentarmos atualizar o arquivo em 2 lugares diferentes ao mesmo tempo, então é melhor garantir que só exista 1 instância da classe.
Na prática, o uso mais comum de um singleton que eu vi é para o Front Controller num aplicativo MVC.
Chega de papo!
Este é o código manjadíssimo para o Singleton:
O segredo está nas 2 funções "private": o constutor é marcado como private para que não possa ser acessado fora da classe. Ou seja, o seguinte código irá gerar um erro:
A única maneira de instanciar a classe é usando o método estático getInstance():
A função "mágica" __clone() também precisa ser sobrecarregada ("overloaded") e marcada como private para evitar que o objeto seja clonado, o que acabaria gerando mais de uma instância.
Beleza! Vamos ao que interessa!
Se você já conheçe o Singleton pode pular para a próxima página!
Prazer, Singleton
Bem resumidamente, o Singleton é o padrão de programação que resolve o a situação na qual é necessário que exista, em qualquer momento, no máximo uma instância de uma devida classe. Várias literaturas do assunto apresentam o exemplo de uma classe de acesso a banco de dados: temos uma classe que é responsável por todas as operações de banco de dados e, para evitar problemas que possam surgir com múltiplas conexões, é necessário que exista somente uma instância do objeto. Outro exemplo muito comum é o de um mecanismo de log que atualiza um arquivo xml ou qualquer outro. Novamente, podem ocorrer erros se tentarmos atualizar o arquivo em 2 lugares diferentes ao mesmo tempo, então é melhor garantir que só exista 1 instância da classe.
Na prática, o uso mais comum de um singleton que eu vi é para o Front Controller num aplicativo MVC.
Chega de papo!
Este é o código manjadíssimo para o Singleton:
class Singletao{ // variável estática da classe protected static $instance; private function __construct() { } private function __clone() { } // método estático para poder ser chamado sem que exista uma instância da classe public static function getInstance() { // verifica se a variável estática é uma instância de si mesmo if(!self::$instance instanceof self){ // se não for, a classe se instancia e armazena a instância na variável estática self::$instance = new self(); } // retorna a variável estática return self::$instance; } }
O segredo está nas 2 funções "private": o constutor é marcado como private para que não possa ser acessado fora da classe. Ou seja, o seguinte código irá gerar um erro:
$foo = new Singletao();
A única maneira de instanciar a classe é usando o método estático getInstance():
$foo = Singletao::getInstance();
A função "mágica" __clone() também precisa ser sobrecarregada ("overloaded") e marcada como private para evitar que o objeto seja clonado, o que acabaria gerando mais de uma instância.
Beleza! Vamos ao que interessa!
Parabéns!