Перед тем как мы рассмотрим паттерны Joomla: Factory и Singleton, разберем немного паттерны вообще.
Один из наиболее часто используемых паттернов — Iterator, описывающий выполнение одной задачи много раз в цикле. Joomla использует достаточно много паттернов, многие из которых сложнее чем Iterator.
Паттерн Factory — создающий паттерн (creational pattern), использующийся для создания и возврата объектов. Используется в случаях, когда согласно параметрам создаются объекты разных классов, часто подклассов одного абстрактного класса. В Joomla есть static-класс JFactory, наследующий factory-паттерн. Данный класс позволяет нам легко создавать глобальные объекты и получать к ним доступ.
Например:
$db=& JFactory::getDBO(); $user=& JFactory::getUser(); $document=& JFactory::getDocument(); |
Паттерн Singleton используется для создания только одного объекта указанного класса. Конструктор такого класса является protected или private при этом используется static-метод для создания класса. Многие классы Joomla используют псевдо-singleton паттерн для работы с объектами, в частности, static-метод getInstance(); в некоторых случаях JFactory используется для работы с этим методом. Классы которые наследуют этот метод, не всегда являются классами типа Singleton.
Имеет смысл использовать вышеперечисленное в иерархическом порядке: JFactory метод, getInstance(), нормальный конструктор (new).
В случаях, когда и JFactory и класс имеют методы для создания объекта, предпочтение стоит отдавать JFactory. Если класс предлагает более подходящий метод getInstance(), чем JFactory, конечно, можете использовать его.
В последнее время часто приходися слышать от «гуру» что Синглтон это не самый лучший паттерн, «антипатерн» и тп.
Пробовал погуглить на эту тему, а главное как реализовать одиночную сущность другим «более правильным» способом.
Нашел всего лишь несколько упоминаний о том, что
1 Синглтон может служить причиной утечек памяти
2 Неудобно часто писать Classname::getInstance для вызова
Причины первого пункта мне непонятны, второе же имеет право на жизнь, однако остается непонятным чем же заменить привычный паттерн.
Интересно узнать ваше мнение по этому вопросу.
В качестве альтернативы также предлагается некий dependency injection — однако суть его я так и не понял, кроме того удобнство использования тоже под большим сомнением.
Привет, подзабыл про вопрос, сорри.
Могу судить про синглтон только в php и только по книгам в т.ч. и от самих Zend — они «ничего такого» про singleton не пишут .
Есть ли какое-то решение (шаблон) для передачи объектов в php-модуль средствами ajax? Или, перефразируя вопрос — как добиться передачи объектов в Registry-singleton при асинхронных запросах...