Блог

Pattern/FAQ: Singleton (Одиночка)

Singleton – один из самых простых шаблонов для понимания. Основное назначение – гарантировать существование только одно экземпляра класса. Причиной обычно является следующее: требуется только один объект исходного класса и Вам необходимо, что бы объект был доступен в любом месте приложения, т.е. глобальный доступ, и не позволять создавать объекты этого класса. Класс можно модифицировать, только расширяя его, и потом порождая с его помощью объекты этих “модифицированных классов”.

Класс “Одиночка” должен иметь как миниму одну операцию – Instance она предоставляет доступ к единственному экземпляру. Как правило это статический метод для создания экземпляра класса, при обращении к которому возвращается ссылка на оригинальный объект.

Одним из преимуществ является то что благодаря использованию, этого паттерна и единственному экземпляру, прастранство имен освобождается от множества глобальных переменных.

<?php
class Singleton {
    private static $instance = null;  // экземпляра объекта
    private function __construct() { /* ... @return Singleton */ }  // Защищаем от создания через new Singleton
    private function __clone()     { /* ... @return Singleton */ }  // Защищаем от создания через клонирование
    private function __wakeup()    { /* ... @return Singleton */ }  // Защищаем от создания через unserialize
    
    // Возвращает единственный экземпляр класса. @return Singleton
    public static function getInstance() 
    {    
        if(self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function doAction() { /* ... */ }
}

Singleton::getInstance()->doAction(); // Применение

Singleton (Одиночка) – обеспечивает существование единственного экземпляра класса а так же единственного доступа к нему.

Ключoм реализации шаблона Singleton является статическая переменная, переменная чье значение остается неизменным при исполнении за ее приделами. Это позволяет сохранить объект оригинальным между вызовами статического метода Singleton::getInstance(), и возвратить ссылку на него при каждом последующем вызове метода. Имейте так же в виду, что конструктор, как правило, приватный. Что бы обеспечить использование всегда только одного объекта Singleton мы должны ограничить доступ к конструктору, что бы при попытке создания нового объекта возникала ошибка.

Хорошо описано работу в книге “Андрій БудайДизайн-патерни — просто, як двері