Skip to content

Instantly share code, notes, and snippets.

@AlexGalhardo
Last active August 24, 2019 21:39
Show Gist options
  • Select an option

  • Save AlexGalhardo/d7051fcb5467bb2a3b3bd69b161672fa to your computer and use it in GitHub Desktop.

Select an option

Save AlexGalhardo/d7051fcb5467bb2a3b3bd69b161672fa to your computer and use it in GitHub Desktop.
  • 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

      1. Deixar o construtor privado, pois assim ninguém deve conseguir instanciar a classe, apenas o próprio Singleton.
      1. 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.
      1. 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.
      1. 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();

?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment