Thursday, April 16, 2009

Как реализовать Singleton в Perl

Паттерн проектирования Singleton используется когда необходимо, чтобы в приложении существовал только один экземпляр объекта. Примеры: логгер, конфиг или класс, использующий единственное соединение с БД.

Чтобы создать Singleton-класс в Perl, можно воспользоваться модулем Class::Singleton. Этот модуль предоставляет метод instance, при вызове которого возвращается один и тот же объект, заботливо сохраненный в глобальной переменной отнаследованного класса:
package MyConfig;
use base 'Class::Singleton';
...

# в основной программе
my $conf1 = MyConfig->instance(); # создан объект MyConfig
my $conf2 = MyConfig->instance(); # тот же самый объект


Еще один распространный способ - сохранение объекта в объявленной с помощью my локальной переменной, доступной из конструктора. (Начиная с версии Perl 5.10, для этого также можно использовать state):


package MyConfig;

{
my $singleton;
sub instance {
unless (defined $singleton) {
my $class = shift;
my $self = {};
$singleton = bless $self, $class;
}
return $singleton;
}
}


Этот метод отлично подходит, если класс не наследуется. В противном случае лучше использовать Class::Singleton.