+3

O Design Pattern Singleton, na prática

criado por Alex Weber em 01/06/2009 11:39pm
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:
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!

Comentários:

Mostrando 1 - 1 de 1 comentários
Show de bola cara!

Parabéns!
31/01/2011 2:45pm (~5 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)