Шаблон реестра и ленивый экземпляр зарегистрированных объектов

Давайте представим, что у нас есть шаблон реестра ...

<?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);
}

}
?>

Используя эту реализацию очень легко ...

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

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

Но, как вы видите, мы добавляем экземпляры в реестр, даже если они нам не нужны (да, все зависит от производительности). Итак, вопрос в том ... Как изменить шаблон реестра, чтобы можно было выполнять ленивую реализацию?

Вот что я ищу ...

<?
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();
}

}
?>

Как вы видете,DatabaseAdapter() или жеRedis() будет создан только в том случае, если мы их запросим. Кажется, все в порядке, но, как вы видите, это не отдельный класс, потому что_db(), _redis() методы содержат константы соединения и т.д. Как этого избежать? Как определить метод реестра в классе реестра, чтобы разделить класс Registy и объекты внутри него?

Мне очень жаль моего английского, но я надеюсь, что он вам понятен.

Спасибо.

PS: Весь код выше был написан 1 мин. назад и не был проверен.

Ответы на вопрос(2)

Ваш ответ на вопрос