PHP Patterns parte 1: Singleton

Situação:

Em determinadas situações no desenvolvimento de nossa aplicação precisamos que um ou mais recursos criados uma única vez sejam compartilhados ficando disponíveis em todo o ciclo da aplicação. Um exemplo bem comum na utilização do pattern Singleton é o objeto de conexão com o banco de dados. Geralmente o objeto é criado quando a aplicação é chamada e destruída quando a aplicação termina. Você não precisa criar o objeto de conexão com o banco em todos os lugares que precisa dele, isso enquanto a aplicação estiver sendo executada. Ao invés disso a idéia é que possamos reutilizar a conexão que já foi estabilizada anteriormente.

Solução:

Quando você precisa de uma instância exclusiva de uma classe, como no caso da conexão com o banco de dados, podemos utilizar um pattern chamado Singleton. Uma classe baseado no pattern Singleton, inicializa uma instância da classe desejada e à disponibiliza através de um método statico tipicamente chamado de getInstance(). O mesmo objeto será retornado toda vez que solicitado. O objeto será criado uma única vez.

Implementar o Singleton no PHP 5 é muito simples. Segue abaixo o código de implementação do pattern Singleton.

<php
class DB {
  private static $instance = false;

  private function __construct() {}

  public static function getInstance() {
    if (false === DB::$instance) {
      DB::$instance = new DB;
    }
    return DB::$instance;
  }
}

$db = DB::getInstance();
$db->query("SELECT * FROM tabela");

Primeiramente definimos uma propriedade privada onde será armazenado o objeto único.
private static $instance = false;

Criamos um constrtutor da classe privado e sem corpo. Dessa forma, impedimos que a classe seja instanciada diretamente. A idéia aqui é forçar o programador a usar o método getInstance() que é declarado de forma estática.
private function __construct() {}

Finalmente implementamos o método estático getInstance() que irá nos retornar o objeto armazenado na propriedade $instance. Na primeira chamada ao método, o objeto DB será criado. Nas chamadas seguintes, o método retorna o objeto já criado anteriormente:
public static function getInstance() {
  if (false === DB::$instance) {
    DB::$instance = new DB;
  }
  return DB::$instance;
}

Utilizando a classe baseado no pattern Singleton:
$db = DB::getInstance();
$db->query("SELECT * FROM tabela");

Please follow and like us:

Comments

  1. By Emerson

Follow

Get every new post on this blog delivered to your Inbox.

Join other followers: