Основное достоинство Одиночки одновременно является и его недостатком. Допустим у нас есть класс для работы с базой данных реализованный на singleton (о ужОс, нужно было хотя бы фабрику). Всё замечательно работает, пока в один непогожий день мы не придумываем держать данные в разных базах на разных серверах. Ну и этого геморроя нам мало, поэтому от возможностей мускула мы отказываемся. И приплыли… Соединение у нас то ОДНО. Отказываться от singleton и перелопачивать тонны кода тоже не с руки, значим поставим костыль.Можно было бы использовать registry, но опять же куча правок и смена Db::getInstance() на Regisrty::get(‘db0′) Regisrty::get(‘db1′). От этой мысли мы возьмём на заметку способ доступа по ключу Db::getInstance(‘db0′) Db::getInstance(‘db1′).
Для этого сделаем $instance массивом, а чтобы не хранить в памяти ключи и не переписывать код Db::getInstance() будем хранить последнее значение в статической переменной $cursor
class Foo {
private static $instance = array();
private static $cursor;
private function __construct() {
echo 'Created ' . __CLASS__;
}
private function __clone() {
}
public static function getInstance($cursor = 0) {
if ($cursor !== null) {
self::$cursor = $cursor;
}
if (!array_key_exists(self::$cursor, self::$instance)) {
self::$instance[self::$cursor] = new self();
}
return self::$instance[self::$cursor];
}
}
echo 'Foo::getInstance(): ';
$o[] = Foo::getInstance();
echo '<br>Foo::getInstance(): ';
$o[] = Foo::getInstance();
echo '<br>Foo::getInstance(1): ';
$o[] = Foo::getInstance(1);
echo '<br>Foo::getInstance(0): ';
$o[] = Foo::getInstance(0);
var_dump($o);
В итоге мы получим нечто этакое
Foo::getInstance(): Created Foo Foo::getInstance(): Foo::getInstance(1): Created Foo Foo::getInstance(0): array 0 => object(Foo)[1] 1 => object(Foo)[1] 2 => object(Foo)[2] 3 => object(Foo)[1]
Создали одну копию у неё индекс «0″, при повторном вызове без параметра получаем всё тот же singleton, а когда передали индекс «1″, то создался ещё один экземпляр класс Foo, последующие вызовы уже будут работать с ним, пока не переключимся на версию «0″ Foo::getInstance(0).
Как бы всё, можете писать свой хайлод или модифицировать старый код.
Поделиться в соц. сетях
Похожие посты:
верску кода поправь
Спасибо, наверное после обновления хайлайтера перестал перебиваться стиль темы div.post div.entry code, убрал пока display: block;