Padrão de registro e instanciação lenta de objetos registrados

Vamos imaginar que temos um padrão de registro ...

<?php

class Registry
{

private static $objects     = array();
private static $instance    = null;

public static function getInstance() {
    if (self::$instance == null) {
        self::$instance = new Registry();
    }
    return self::$instance;
}

protected function _get($key) {
    return ($this->objects[$key]) ? $this->objects[$key] : null;
}

protected function _set($key, $val) {
    $this->objects[$key] = $val;
}

public static function get($key) {
    return self::getInstance()->_get($key);
}

public static function set($key, $object) {
    return self::getInstance()->_set($key, $object);
}

}
?>

Usar esta realização é realmente fácil ...

<?
Registry::set('db', $db_client);
Registry::set('redis', $redis_client);

//Using registered objects is really easy
Registry::get('db')->query("...");
Registry::get('redis')->get("...");
?>

Mas como você pode ver, estamos adicionando instâncias ao registro, mesmo que não precisemos delas (sim, é tudo uma questão de desempenho). Então, a questão é ... Como modificar o padrão do Registro para poder instanciar preguiçosamente?

Aqui está o que estou procurando ...

<?
class Registry
{

private static $objects     = array();
private static $instance    = null;

public static function getInstance() {
    if (self::$instance == null) {
        self::$instance = new Registry();
    }
    return self::$instance;
}

protected function _db() {
    if (!$this->objects['db']) {
        $this->objects['db'] = new DatabaseAdapter(DB_HOST, DB_NAME, DB_USER, DB_PASSWORD);
    }
    return $this->objects['db'];
}

protected function _redis() {
    if (!$this->objects['redis']) {
        $this->objects['redis'] = new Redis(REDIS_HOST, REDIS_DB, REDIS_USER, REDIS_PASSWORD);
    }
    return $this->objects['redis'];
}

public static function db() {
    return self::getInstance()->_db();
}

public static function redis() {
    return self::getInstance()->_redis();
}

}
?>

Como você pode ver,DatabaseAdapter() ouRedis() será criado apenas quando solicitá-los. Tudo parece estar bem, mas como você pode ver, não é uma aula independente porque_db(), _redis() métodos contém constantes de conexão etc. Como evitá-lo? Como posso definir o método de registro na classe de registro para separar a classe e os objetos Registy dentro dela?

Sinto muito pelo meu inglês, mas espero que esteja claro para você.

Obrigado.

PS: Todo o código acima foi escrito 1 min. atrás e não foi testado.

questionAnswers(2)

yourAnswerToTheQuestion