-
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 para um conjunto (entidade matemática) que contenha apenas um elemento.
-
Alguns 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.
-
Onde Usar
- Quando você necessita de somente uma instância da classe, por exemplo, a conexão com banco de dados, vamos supor que você terá que chamar diversas vezes a conexão com o banco de dados em um código na mesma execução, se você instanciar toda vez a classe de banco, haverá grande perda de desempenho, assim usando o padrão singleton, é garantida que nesta execução será instânciada a classe somente uma vez.
- Lembrando que este pattern é considerado por muitos desenvolvedores um antipattern, então, cuidado onde for utilizá-lo.
-
Como fazer a implementação do Singleton
-
- Deixar o construtor privado, pois assim ninguém deve conseguir instanciar a classe, apenas o próprio Singleton.
-
- Criar um atributo privado e estático do mesmo tipo da classe (instance). Algumas linguagens não tipadas não irão precisar do tipo, caso do PHP, por exemplo.
-
- Método getInstance() é o principal ponto da classe. Ele verifica se a variável instance já foi iniciada, caso não tenha sido, ele faz sua criação pela primeira e única vez.
-
- Para fazer a conexão, devemos chamar o getInstance da seguinte forma: ClasseSingleton.getInstance().
-
<?php
/**
* Singleton parte do princípio que só deve ter
* uma instancia de uma classe em todo o sistema!
*/
class Pessoa {
private $nome;
private $idade;
public static function getInstance(){
static $instance = null;
if($instance === null){
$instance = new Pessoa();
}
return $instance;
}
// o método constructor é privado para que
// nenhuma outra instancia desta classe seja criado!
private function __construct(){
}
public function setNome($n){
$this->nome = $n;
}
public function getNome(){
return $this->nome;
}
public function setIdade($idade){
$this->idade = $idade;
}
public function getIdade(){
return $this->idade;
}
}
// vou rodar diretamente um método público desta classe
$cara = Pessoa::getInstance();
$cara->setNome("Galhardo");
echo "Nome: " . $cara->getNome();
$cara2 = new Pessoa(); // vai dar erro
// se eu fizer deste modo, a instancia antiga,
// $cara, vai deixar de existir no sistema
// assim, apenas a instancia $novaInstancia vai existir no sistema agora!
$novaInstancia = Pessoa::getInstance();
?>