Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Паттерн singleton

Покажите на пальцах для чего нужен Singleton? class Singleton {
protected static $instance; // object instance
/** * Защищаем от создания через new Singleton * * @return Singleton */ private function __construct() { /* ... */ }
/** * Защищаем от создания через клонирование * * @return Singleton */ private function __clone() { /* ... */ }
/** * Защищаем от создания через unserialize * * @return Singleton */ private function __wakeup() { /* ... */ }
/** * Возвращает единственный экземпляр класса * * @return Singleton */ public static function getInstance() { if ( is_null(self::$instance) ) { self::$instance = new Singleton; } return self::$instance; }
public function doAction() { /* ... */ }
}
//usage Singleton::getInstance()->doAction(); Для чего писать так? Если можно написать вот так: class Singleton { public static function doAction() { /* ... */ } }
Singleton::doAction(); Не проще, нет? %) Только не нужно давать ссылок на википедию и т.п. Всем спасибо! @knes, @ikoolik и @Nord001 — накинул вам по 25 очков за старание.


Ответ

Синглтон нужен, чтобы точно знать, что у нас создан ОДИН объект данного класса. Классический пример - коннект к базе данных.
Если куча скриптов внутри одного файла теребит БД в разных функциях, приходится заводить глобальную переменную соединения и постоянно проверять жива ли она, на случай если в данный момент идет первое подключение к БД.
Синглтон же сам создает соединение, если оно еще не было установлено, либо просто возвращает готовую ссылку. Вам же требуется только вызвать его, уже ни о чем не заботясь: лишний раз базу не потревожат.
Второй ваш пример плох тем, что можно насоздавать кучу объектов данного класса, которые не будут знать что происходит у остальных.

Комментариев нет:

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