PHP Patterns parte 3: Factory

Posted on setembro 8, 2010. Filed under: PHP |

A classe genérica que implementa o pattern Factory provê a faciliade de criar instâncias de classes que fornecem as mesmas tarefas porém de maneiras diferentes. Traduzindo ao pé da letra, Factory pode ser definido como uma “Fábrica de Objetos”.
Normalmente quando precisamos criar um objeto, utilizamos o operador “new” seguido do nome da classe desejada. Porém em algumas situações o operador “new” pode ser uma problemática. Alguns tipos de objetos necessitam de uma série de passos para serem criados: – Computar ou obter configurações iniciais do objeto a ser criado, – executar funções de outros objetos para poder criar o objeto desejado, etc. Para esses casos é interessante a utlização do pattern Factory.

Por exemplo: Ao invés de instanciar o objeto com “new”:

$db = new Database_Mysql();

Utilizamos o pattern Factory na classe Database:

$db = Database::factory(Database::MYSQL));

Implementando o pattern Factory:
class Database {

  const MYSQL = 1;
  const PGSQL = 2;
  const ORACLE = 3;

  public static function factory($type = self::MYSQL)
  {
    switch ($type) {
      case self::MYSQL:
        return new Database_Mysql();
      case self::PGSQL:
        return new Database_Pgsql();
      case self::ORACLE:
        return new Database_Oracle();
      default:
        throw new Exception("Adaptador não idenficado");
    }
  }
}

class Database_Mysql {
// ...
}

class Database_Pgsql {
// ...
}

class Database_Oracle {
// ...
}

Instanciado as classes de banco de dados com o Factory explicado no exemplo anterior:

$mysql = Database::factory(Database::MYSQL);
$pgsql = Database::factory(Database::PGSQL);
$oracle = Database::factory(Database::ORACLE);

Detalhando a classe Database

Primeiramente, declaramos três constantes que serão utilizadas para identificar a classe que desejamos obter no factory. Utilizamos nomes sugestivos e de fácil identificação.

class Database {

  const MYSQL = 1;
  const PGSQL = 2;
  const ORACLE = 3;

Depois implementamos o método “factory”, que fará o serviço de retornar a instância do objeto desejado. Opcionalmente podemos informar qual objeto queremos através do parâmetro “$type”. Aqui podemos utilizar as constantes definidas anteriormente para facilitar o nosso trabalho e tornar o código mais legível. De acordo com o parâmetro informado podemos obter uma instância das classes Database_Mysql, Database_Pgsql ou Database_Oracle.
  public static function factory($type = self::MYSQL)
  {
    switch ($type) {
      case self::MYSQL:
        return new Database_Mysql();
      case self::PGSQL:
        return new Database_Pgsql();
      case self::ORACLE:
        return new Database_Oracle();
      default:
        throw new Exception("Adaptador não idenficado");
    }
  }

Finalmente abaixo o exemplo de um código que utilizamos para instânciar o driver do Postgresql.
$pgsql = Database::factory(Database::PGSQL);

Make a Comment

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: