Singleton

Origem: Wikipédia, a enciclopédia livre.

Diagrama UML de uma classe singleton.

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() );
Ferramentas pessoais
Criar um livro