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

Одиночка (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(), и возвращать ссылку на него при каждом последующем вызове метода.
Так же стоит обратить внимание, что конструктор, как правило, приватный. Это обеспечивает использование всегда только одного объекта Одиночки.

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

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