igortik
Новичок
Покритикуйте реализайцию патерна SIngletone
Явные минусы:
1. Надо наследовать
2. Образуется зависимость
3. Конструктор потомка должен быть публичным, если передаем аргументы в getInstance($args)
Плюсы:
1. Вся реализация патерна в одном файле
2. Единое хранилище инстанцированных объектов
Кстати, по поводу п.3. из раздела "Минусы". Когда пробуем отправить аргументы конструктору потомка через Reflection, то, если конструктор этого потомка отличный от публичного, то бросается исключение, т.е. объект создается без передачи аргументов и, к сожалению, никакой ошибки не выводится при попытке дебага данного глюка Reflcetion.
Что думаете?
PHP:
abstract class Singletone
{
// Хранилище инстанцированных объектов
private static $_instances = array();
// Приватный конструктоп
private function __construct(){}
// Запрещаем клонирование
final private function __clone(){}
// Получение инстанцированного объекта
public static function getInstance()
{
// Имя класса, объект которого создается
$className = get_called_class();
if(!isset(self::$_instances[$className])){
// Аргументы, передаваемые конструктору потомка
$arguments = func_get_args();
// Создание объекта
try {
$reflection = new ReflectionClass($className);
// Создание объекта с передачей параметров конструктору потомка
// Конструктор должен быть Публичным!
self::$_instances[$className] = $reflection->newInstanceArgs($arguments);
}
catch(ReflectionException $E) {
// Создание объекта без передачи параметров конструктору потомка
self::$_instances[$className] = new $className();
}
}
return self::$_instances[$className];
}
// Уничтожение объекта
public static function clearInstance($className=NULL)
{
if(isset(self::$_instances[$className])){
unset(self::$_instances[$className]);
return true;
}
return false;
}
// Замена объекта
public static function setInstance($className=NULL,$newInstance=NULL)
{
if(isset(self::$_instances[$className])){
self::$_instances[$className] = (object) $newInstance();
return true;
}
return false;
}
// Вывод информации об объекте
public static function testInstance($className=NULL)
{
if(isset(self::$_instances[$className])){
var_dump(self::$_instances[$className]);
}
return false;
}
// Массив инстанционированных объектов
public static function getInstances()
{
return self::$_instances;
}
}
1. Надо наследовать
2. Образуется зависимость
3. Конструктор потомка должен быть публичным, если передаем аргументы в getInstance($args)
Плюсы:
1. Вся реализация патерна в одном файле
2. Единое хранилище инстанцированных объектов
Кстати, по поводу п.3. из раздела "Минусы". Когда пробуем отправить аргументы конструктору потомка через Reflection, то, если конструктор этого потомка отличный от публичного, то бросается исключение, т.е. объект создается без передачи аргументов и, к сожалению, никакой ошибки не выводится при попытке дебага данного глюка Reflcetion.
Что думаете?