Шаблон проектирования — Одиночка

Одиночка (Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса.
Применение — когда необходим только один экземпляр класса, с возможностью доступа к нему из любой точки приложения.
Примеры использования:

  • Запись сообщений в лог-файл
  • Доступ к базе данных

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

Примеры реализации PHP5:

class Singleton {
    private static $instance = null;

    // Защищаем от создания второго экземпляра
    private function __construct() {}
    private function __clone() {}
    private function __wakeup() {}

    // Инициализация объекта или возвращение ранее созданного
    public static function getInstance() {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

	public function doAction() { }
}
// Использование
Singleton::getInstance()->doAction();

Примеры реализации PHP5.4 и выше с помощью Traits:

trait Singleton {
    private static $instance = null;

    // Защищаем от создания второго экземпляра
    private function __construct() {}
    private function __clone() {}
    private function __wakeup() {}

    // Инициализация объекта или возвращение ранее созданного
    public static function getInstance() {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

class Foo {
    use Singleton;

    private $bar = 0;

    public function incBar() {
        $this->bar++;
    }

    public function getBar() {
        return $this->bar;
    }
}
// Применение

$foo = Foo::getInstance();
$foo->incBar();

var_dump($foo->getBar());

$foo = Foo::getInstance();
$foo->incBar();

var_dump($foo->getBar());

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

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

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