Patterns

Padrões (Patterns) são formas de descrever melhores práticas e bons projetos. Eles mostram soluções flexíveis para problemas comuns de programação.

Factory

O padrão Factory permite a instanciação de objetos em tempo de execução. É chamado de Factory uma vez que é responsável por "produzir" um objeto.

Exemplo 19-23. Factory Method

<?php
class Exemplo
{
    
// Factory method
    
function &factory($type)
    {
        if (include_once
'Drivers/' . $type . '.php') {
            
$classname = 'Driver_' . $type;
            return new
$classname;
        } else {
            
throw new Exception ('Driver não encontrado');
        }
    }
}
?>

Definir esse método numa classe permite que drivers sejam carregados em tempo de execução. Se a classe Exemplo fosse uma classe de abstração de banco de dados, carregar um driver MySQL e um driver SQLite poderia ser feito como se segue:

<?php
// Carregar um driver MySQL
$mysql = Exemplo::factory('MySQL');

// Carregar um driver SQLite
$sqlite = Exemplo::factory('SQLite');
?>

Singleton

O padrão Singleton se aplica em situações em que é preciso haver uma só instância de uma classe. O exemplo mais comum é uma conexão com um banco de dados. Implementar esse padrão permite ao programador fazer essa instância única ser facilmente acessível por muitos outros objetos.

Exemplo 19-24. Função Singleton

<?php
class Exemplo
{
    
// Guarda uma instância da classe
    
static private $instance;
    
    
// Um construtor privado
    
private function __construct()
    {
        echo
'Sou um construtor';
    }

    
// O método singleton
    
static public function singleton()
    {
        if (!isset(
self::$instance)) {
            
$c = __CLASS__;
            
self::$instance = new $c;
        }

        return
self::$instance;
    }
    
    
// Método exemplo
    
public function latir()
    {
        echo
'Au!';
    }
}

?>

Isso permite que uma instância única de Exemplo seja recuperada.

<?php
// Isso falharia porque o construtor é privado
$test = new Exemplo;

// Isso sempre vai recuperar uma instância da classe
$test = Exemplo::singleton();
$test->latir();

?>