7 января 2009

Singleton

Введение
На мой взгляд это наиболее простой и часто используемый интуитивно шаблон. Ознакомившись с ним, с удивлением обнаружил его во всех своих разработках. Правда, реализованным с помощью глобальных переменных.

Мотивация к использованию
Singleton Pattern — один из наиболее известных шаблонов проектирования. Почти в любой объктно-ориентированной программе обычно существует один-два объекта, которые инициализируются в начале, и используются на всем протяжении работы приложения. Таким объектом может быть, logger — объект для ведения log-ов (log в переводе с англ. — журнал). Так в случае с log-ами, нам нет нужды каждый раз создавать объект класса logger, лишь для того, чтобы произвести запись в журнал. Достаточно создать один экземпляр класса, в начале работы программы, и пользоваться им. Такие классы (как например logger) будем называть singleton классами.

Важно отметить, что singleton pattern также решает еще одну наболевшую задачу. Часто бывает так, что мы передаем в функцию (метод) параметр лишь для того, чтоб эта функция передала этот параметр еще дальше. Или же несколько частей программы постоянно нуждаються в «свежей» информации о состоянии объекта, который меняется по ходу работы; тогда снова и снова приходиться передавать объект как параметр. Конечно, если такая ситуация возникает пару раз за всю работу приложения, можно не обращать на это внимания. Но, если один и тот же объект бестолково «футболяется» между всеми модулями и функциями программы, может возникнуть страшная путаница и, как следствие, ошибки. В таких ситуациях следует использовать singleton класс. Вместо того, чтоб передавать по цепочке объект из функции в функцию, singleton pattern обеспечивает возможность, каждой части програмы, получить по ссылке единственный для всей программы объект.

Вот какие преимущества дает singleton pattern:

Мы используем ссылки на один и тот же экземпляр класса в разных частях проекта. Таким образом не нужно создавать новый объект каждый раз когда мы хотим воспользоваться каким-то методом — просто пользуемся ссылкой.
Теперь не нужно передавать объект как аргумент, чтоб все части программы были «в курсе» о текущем состоянии объекта. Все ссылки указывают на один объект.

Еще раз сформулируем суть singleton pattern: Убедиться, что существует только один экземпляр класса и обеспечить доступ к нему из любой части программы.

Метод getInstance() — суть Singleton pattern. С помощью getInstance() мы можем получить доступ к объекту класса logger откуда угодно. В тоже время, методы constructor() и clone(), объявленные как приватные (private), обеспечивают единственность экземпляра класса logger. Удален источник возможных ошибок — разработчик не может случайно создать еще один объект такого же типа (Такой же принцип действует и при построении value object — убрать, спрятать все методы, с помощью которых, объекты смогут <размножаться>). Следовательно, getInstance()— единственный способ <достучаться> к представителю класса.

Источник: http://developer.co.ua/posts/view/singleton_pattern_v_php

Код шаблона на php4


class Singleton {

function Singleton( $directCall = true ) {

if ( $directCall ) {

trigger_error("Нельзя использовать конструктор для создания класса Singleton.

Используйте статический метод getInstance ()",E_USER_ERROR);

}

//TODO: Добавьте основной код конструктора здесь

}


function &getInstance() {

static $instance;

if ( !is_object( $instance ) ) {

$instance = new Singleton( false );

}

return $instance;

}

}

?>


Код шаблона на php5


class Singleton {

// object instance

private static $instance;

private function __construct() {}

private function __clone() {}

public static function getInstance() {

if (self::$instance === null) {

self::$instance = new self;

}

return self::$instance;

}

public function doAction() {

...

}

}


Источник: http://ru.wikipedia.org/wiki/Синглтон_(шаблон_проектирования)#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_PHP_5

© Weltkind 2008
validator