Singleton
Origem: Wikipédia, a enciclopédia livre.
Singleton, é um padrão de projeto de software (do inglês Design Pattern). Este padrão garante a existência de apenas uma instância de uma classe, mantendo um ponto global de acesso ao seu objeto.
Nota linguística: O termo vem do significado em inglês quando se resta apenas uma carta nas mãos, num jogo de baralho.
Muitos projetos necessitam que algumas classes tenham apenas uma instância. Por exemplo, em uma aplicação que precisa de uma infraestrutura de log de dados, pode-se implementar uma classe no padrão singleton. Desta forma existe apenas um objeto responsável pelo log em toda a aplicação que é acessível unicamente através da classe singleton.
Índice |
[editar] Exemplos
[editar] Em Java
Segue um exemplo em Java de classe Singleton usada em log de dados. Esta classe suporta inicialização sob demanda e ambientes multi-thread.
public class SingletonLog {
// Construtor privado. Suprime o construtor público padrao.
private SingletonLog() {
// Leitura da configuração de log. Normalmente descrita em um arquivo.
}
// Faz o log de eventos da aplicacao
public void doLog(String eventDescription) {
}
//Retorna a instância única da classe SingletonLog
public static SingletonLog getInstance() {
return SingletonLogHolder.instance;
}
//Classe auxiliar para criacao da instancia. Evita problemas de sincronizacao de threads.
private static class SingletonLogHolder {
private static SingletonLog instance = new SingletonLog();
}
}
[editar] Em C++
Segue um exemplo em C++ da implementação de uma classe Singleton:
class MyClass { private: MyClass() {} //contructor padrão, não deve ser utilizado isoladamente public: static MyClass& getInstance() { static MyClass *instance = 0; if (!instance) instance = new MyClass(); return *instance; } };
[editar] Em Delphi
Abaixo segue um exemplo de como implementar uma classe Singleton:
Por exemplo, numa classe Fachada, onde se encontra todos os métodos disponíveis para a interface da aplicação, pode ser criado um método dinâmico para que todos os que visualizam essa classe, não criarem mais instâncias da mesma.
class function TFachada.ObterInstancia: TFachada; begin If FInstance = nil Then FInstance := Cliente.Fachada.TFachada.Create();//objeto instanciado através do Finstance Result := FInstance;//retorna o objeto end;
[editar] Em PHP
Segue abaixo uma implementação do padrão singleton em PHP.
class minhaClasse { // Mantenha o construtor protected/private para não ser instanciado por "new minhaClasse" protected function __construct() {} public static function getInstance() { static $instance = null; if(!isset($instance)) { $instance = new self; // ou então $instance = new minhaClasse(); } return $instance; } }
[editar] Em VB.NET
Public Class MyClass Private Shared _instancia As MyClass Private Shared objetoSincronia As New Object Private Sub New() End Sub Public Shared Function getInstancia() As MyClass If _instancia Is Nothing Then SyncLock objetoSincronia If _instancia Is Nothing Then _instancia = New MyClass End SyncLock End If Return _instancia End Function End Class
[editar] Em ActionScript 3
package{ public class ExemploSingleton { private static var instance:ExemploSingleton; public function ExemploSingleton(enforcer:SingletonEnforcer){ if (enforcer == null) throw new Error("Só pode haver uma instância de ExemploSingleton"); } public static function getInstance() : ExemploSingleton { if (instance == null) instance = new ExemploSingleton( new SingletonEnforcer ); return instance; } } } //Para bloquear o acesso ao constructor. class SingletonEnforcer { }
[editar] Em JavaScript
function Page(){ var width = 800; this.getWidth = function(){ return width; } } Page.instance = null; Page.getInstance = function(){ if (Page.instance == null) Page.instance = new Page(); return Page.instance; } document.write( Page.getInstance().getWidth() );

