Фабрика Singleton для управления несколькими объектами базы данных - PullRequest
0 голосов
/ 21 июля 2010

Я создаю приложение PHP, которое должно взаимодействовать с несколькими структурно идентичными базами данных. Я хотел бы использовать фабрику синглтонов для раздачи соединений с базами данных и минимизации количества повторяющихся соединений. Я также хотел бы обернуть класс базы данных несколькими функциями.

Было бы чрезвычайно удобно, если бы я мог делать все это в одном классе. Я попытался использовать одноэлементную фабрику (в то время это казалось хорошей идеей), но только для того, чтобы понять, что, похоже, нужно возвращать другие классы, чтобы быть полезными. Есть ли простой способ объединить функции фабрики-одиночки и обтекания базы данных, или мне просто поместить функции обтекания базы данных в другой класс?

static private $instance = array();

private function __construct($name) {
    switch ($name) {
        //select db connection
    }

    $this->db = $this->getDb();
    return;
}

protected function __clone() {

}

public static function singleton($name) {
    if (!isset(self::$instance[$name])) {
        $c = __CLASS__;
        self::$instance[$name] = new $c($name);
    }
    return self::$instance[$name];
}

public function wrapperFunction() {
    //stuff
}

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Я делаю нечто подобное довольно часто (например, управление несколькими подключениями к базе данных по имени). Единственное изменение, которое я предлагаю, - это защитить конструктор и массив $instance. Причина в том, что таким способом становится проще тестировать FAR (поскольку вы можете расширить его с помощью класса-оболочки, чтобы иметь возможность получать к ним доступ и создавать и уничтожать экземпляры по мере необходимости). Конечно, это открывает возможность для кого-то сделать это в приложении, но зачем отказываться от возможности управления экземплярами из дочернего класса?

Только мои $ 0,02 ...

0 голосов
/ 21 июля 2010

Похоже, что это возможно было бы возможно при использовании некоторых общесистемных переменных состояния и выполнении некоторых умных действий с func_num_args и func_get_arg в конструкторе.

Однако, в интересах уменьшения количества WTF в минуту , я пойду с предложением GoalBased разделить вещи на два класса.

...