Паттерн: Singleton

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

Паттерн: Singleton: 1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *