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

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

При этом засоряется глобальное пространство имен, классы привязываются к их контексту, тем самым ухудшается инкапсуляция.

UML диаграмма классов шаблона Singleton

UML диаграмма классов шаблона Singleton

Пример использования шаблона программирования Singleton:

//Пример класса для работы с БД
class Singleton {
    
    // Экземпляр класса
    private static $instance;
    
    // Идентификатор соединения с БД
    private static $db;
    
    // Защищаем от создания через конструктор
    private function __construct() {
        // Подключаемся к БД
        self::$db = new PDO(
            'mysql:host=localhost;dbname=database',
            'user',
            'password',
            null
        );
    }
    
    // Защищаем от создания через клонирование
    private function __clone() {}
    
    //Защищаем от создания через unserialize
    private function __wakeup() {}
 
    // Возвращает единственный экземпляр класса
    public static function getInstance() {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    // Выполняет запросы к БД
    public function prepare($statement, $driver_options = array()) {
        return self::$db->prepare($statement, $driver_options);
    }
}

// Пример использования
$TestObject = Singleton::getInstance();
$st = $TestObject->prepare('SELECT * FROM `table`');
$st->execute();
// ...

// Попытка создать дополнительный экземпляр приведет к ошибке
$FaultObject1 = new Singleton(); // Fatal error: Call to private Singleton::__construct() from invalid context

$FaultObject2 = clone $TestObject; // Fatal error: Call to private Singleton::__clone() from context ''

$FaultObject3 = unserialize(serialize($TestObject)); // Fatal error: Call to private method Singleton::__wakeup() from context

Метки: ,

Оставить комментарий

Вы должны авторизоваться для отправки комментария.