Patrón de registro e instanciación perezosa de objetos registrados

Imaginemos que tenemos un patrón 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 realización es 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("...");
?>

Pero como puede ver, estamos agregando instancias en el registro incluso si no las necesitamos (sí, todo se trata de rendimiento). Entonces, la pregunta es ... ¿Cómo modificar el patrón de Registro para poder crear instancias perezosas?

Esto es lo que estoy buscando ...

<?
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 puedes ver,DatabaseAdapter() oRedis() solo se creará en los solicitaremos. Todo parece estar bien, pero como puede ver, no es una clase independiente porque_db(), _redis() los métodos contienen constantes de conexión, etc. ¿Cómo evitarlo? ¿Cómo puedo definir el método de registro dentro de la clase de registro para separar la clase de registro y los objetos dentro de ella?

Lamento mucho mi inglés, pero espero que sea claro para ti.

Gracias.

PD: Todo el código anterior se escribió 1 min. Hace y no fue probado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta