Реализация паттерна singleton (синглтон) в Joomla

Перед тем как мы рассмотрим паттерны 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, конечно, можете использовать его.

Комментариев: 4

  • 30.09.2010 Prof:

    В последнее время часто приходися слышать от «гуру» что Синглтон это не самый лучший паттерн, «антипатерн» и тп.

    Пробовал погуглить на эту тему, а главное как реализовать одиночную сущность другим «более правильным» способом.

    Нашел всего лишь несколько упоминаний о том, что

    1 Синглтон может служить причиной утечек памяти

    2 Неудобно часто писать Classname::getInstance для вызова

    Причины первого пункта мне непонятны, второе же имеет право на жизнь, однако остается непонятным чем же заменить привычный паттерн.

    Интересно узнать ваше мнение по этому вопросу.

  • 30.09.2010 Prof:

    В качестве альтернативы также предлагается некий dependency injection — однако суть его я так и не понял, кроме того удобнство использования тоже под большим сомнением.

  • 12.10.2010 Кирилл:

    Привет, подзабыл про вопрос, сорри.

    Могу судить про синглтон только в php и только по книгам в т.ч. и от самих Zend — они «ничего такого» про singleton не пишут :) .

  • 07.01.2014 Vobi:

    Есть ли какое-то решение (шаблон) для передачи объектов в php-модуль средствами ajax? Или, перефразируя вопрос — как добиться передачи объектов в Registry-singleton при асинхронных запросах...


Добавление комментария:

 css.php