Шаблоны проектирования в PHP: Singleton

PHP
/
2014-09-05 13:54
Просмотры: 8469
UML диаграмма шаблона проектирования(Design Pattern) Singleton

Singleton (Синглтон, одиночка) - порождающий шаблон проектирования, гарантирует, что в приложении(однопоточном) будет использоваться только один(единственный) экземпляр класса. Объекты класса Singleton будут созданы только один раз и при последующих обращениях будет использоваться уже созданный объект, а не будут создаваться новые экземпляры. Это очень удобно и экономно. Например: соединение к БД - нам не нужно каждый раз создавать новое соединение; доступ к объекту конфигурации; в MVC - порождение главного контроллера; объект логирования.

Пример Singletone на PHP

<?php
class Singleton
{
    private static $instance = null;

    public static function getInstance()
    {
        
        if (null === self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    protected function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }
}

class SingletonChild extends Singleton
{
}

$obj = Singleton::getInstance();
var_dump($obj === Singleton::getInstance());             // bool(true)

$anotherObj = SingletonChild::getInstance();
var_dump($anotherObj === Singleton::getInstance());      // bool(false)

var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)

Код выше реализует паттерн проектирования Singleton с использованием статической переменной, в которой храниться объект и метода getInstance для его создания. Обратите внимание:

1. конструктор __construct объявлен как protected, чтобы предотвратить создание нового объекта вне класса с помощью оператора new.

2. магический метод __clone объявлен как private, чтобы предотвратить клонирование объекта с помощью оператора clone.

3. магический метод __wakeup объявлен как private, чтобы предотвратить десериализацию объекта через глобальную функции unserialize().

Синглтон можно реализовать с помощью с помощью позднего статического связывания (Начиная с версии PHP 5.3.0).

<?php
class Singleton
{
    public static function getInstance()
    {
        static $instance = null;
        if (null === $instance) {
            $instance = new static();
        }

        return $instance;
    }

    protected function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }
}

class SingletonChild extends Singleton
{
}

$obj = Singleton::getInstance();
var_dump($obj === Singleton::getInstance());             // bool(true)

$anotherObj = SingletonChild::getInstance();
var_dump($anotherObj === Singleton::getInstance());      // bool(false)

var_dump($anotherObj === SingletonChild::getInstance()); // bool(true)

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

comments powered by Disqus