Продолжая тему паттернов бегло расскажу что это за зверь singleton. На русский язык он переводится как «одиночка», относится к порождающим паттернам и позволяет нам плодить объекты, вернее всего один. Singleton гарантирует, что будет создан только один экземпляр класса. Для этого конструктор делается приватным и создаётся статический метод, который проверяет создан ли уже объект и возвращает нам этот объект.
<?php
class Singleton {
private static $instance;
private function __construct() {
echo "Created " . __CLASS__ . PHP_EOL;
}
private function __clone() {
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
$o = Singleton::getInstance();
$o2 = Singleton::getInstance();
$o3 = new Singleton();
$o4 = clone $o;
?>
Сразу мы вызвали статический метод и у нас создался объект, при этом сработал конструктор и вывелось сообщение. Во второй раз уже не создавался объект и сообщение не появилось. А вот создать $o3 не получится, так как конструктор закрыт, точно так же и с клонированием объекта.
Хотелось бы сказать, что многие относят Singleton к антипаттернам, т.к. он позволяет беззаботно передавать объект между классами и делать это не явно, тем самым портит архитектуру. То же самое относится и к Registry (Реестру) и в этом они похожи.
Я иногда смешиваю Singleton и Registry, помещая во внутрь одиночки реестр, тем самым заполучаю возможность создавать только один объект с заданными параметрами или же добиваюсь лёгкого переключения объектов. Таким методом у меня построен Request в котором хранятся данные о запросе разделённые для разных урлов, что очень важно при компонентном подходе.
Поделиться в соц. сетях
Похожие посты: