Pergunta

O que é o melhor método para usar padrão de design singleton em conjunto com o padrão Factory Method em PHP5? Meu cenário de uso mais simples para isso é conexão com o banco instanciação seletiva apenas uma vez para cada tipo de banco de dados.

Foi útil?

Solução

fábrica singleton para conexão DB:

class Registry
{
    private static $_objects;

    public static function set($key, $object)
    {
        if (!array_key_exists($key, self::$_objects)) self::$_objects[$key] = $object;
    }

    public static function get($key)
    {
        if (array_key_exists($key, self::$_objects)) return self::$_objects[$key];
        else return false;
    }
}

class DBFactory
{
    public static function getConnection($type)
    {
        switch ($type) {
            case 'pdo':
                if (!(Registry::get('DB_PDO') instaceof DbPdo)) Registry::set('DB_PDO', new DbPdo('user', 'pass', ...));
                return Registry::get('DB_PDO')
            case 'mssql':
                //same for other connections
            //...
        }
    }
}

uso:

$factory = DBFactory::getConnection('pdo');

Singletons não são realmente mais necessário porque todos os métodos podem ser chamados estaticamente ... Mas as classes de banco de dados ainda pode ser considerado singletons porque haverá apenas uma única instância de los em seu aplicativo.

Assim, o mesmo efeito é criado usando os padrões de fábrica e de registro.

O registro pode ser substituído, fazendo suas classes de banco de dados singletons em seguida, a fábrica ficaria assim:

class DBFactory
{
    public static function getConnection($type)
    {
        switch ($type) {
            case 'pdo':
                return DbPdo::getInstance('user', 'pass', ...);
            case 'mssql':
                //same for other connections
            //...
        }
    }
}

class DbPdo
{
    private static $_instance;

    private function __construct($user, $pass, ...){ //instantiate object }

    public static function getInstance($user = null, $pass = null, ...)
    {
        if (!(self::$_instance instanceof DbPdo)) self::$_instance = new DbPdo($user, $pass, ...);
        return self::$_instance;
    }
}

Então, você tem a opção de fazer todo o seu DB objetos singletons ou usando um registro. Eu, pessoalmente, gostaria de ir com um registro, porque pode ser usado para armazenar qualquer tipo de objeto, mesmo aqueles onde você não querem fazer a classe um singleton.

Projeto escolhas são sempre submetidos a sabor pessoal imo ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top