Инструменты пользователя

Инструменты сайта


php:shablony_proektirovanija:generative_patterns:singleton

Одиночка (Singleton)

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

У класса есть только один экземпляр, и он предоставляет к нему глобальную точку доступа. При попытке создания данного объекта он создаётся только в том случае, если ещё не существует, в противном случае возвращается ссылка на уже существующий экземпляр и нового выделения памяти не происходит. Существенно то, что можно пользоваться именно экземпляром класса, так как при этом во многих случаях становится доступной более широкая функциональность.

PHP 5

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

php 5.4

<?php
trait Singleton {
    private static $instance = null;
 
    private function __construct() { /* ... @return Singleton */ }  // Защищаем от создания через new Singleton
    private function __clone() { /* ... @return Singleton */ }  // Защищаем от создания через клонирование
    private function __wakeup() { /* ... @return Singleton */ }  // Защищаем от создания через unserialize
 
    public static function getInstance() {
		return 
		self::$instance===null
			? self::$instance = new static() // Если $instance равен 'null', то создаем объект new self()
			: self::$instance; // Иначе возвращаем существующий объект 
    }
}
 
/**
 * Class Foo
 * @method static Foo getInstance()
 */
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());
?>
php/shablony_proektirovanija/generative_patterns/singleton.txt · Последние изменения: 2023/08/07 23:27 — werwolf