вторник, 19 января 2016 г.

Шаблон проектирования Одиночка

Одиночка используется когда необходим ровно один экземпляр какого-то класса, доступный для остальных элементов программы.

Два примера реализации:
package Singleton;
use strict;
use warnings;
use feature 'state';

my $singleton = { rand => int(rand(100)) };

sub instance {
    ref $singleton eq __PACKAGE__ 
        ? $singleton : bless $singleton, shift;
}

sub instance_with_state { 
    state $singleton = { rand => int(rand(100)) };
    ref $singleton eq __PACKAGE__ 
        ? $singleton : bless $singleton, shift;
}

1;

и тестирование для них:

use strict;
use warnings;

use Test::More;
BEGIN { use_ok('Singleton'); }

# Тестируем одиночку для случая, когда объект хранится 
# в локальной переменной класса Singleton.
my $singleton = Singleton->instance;
my $rand      = $singleton->{rand};

ok(($rand > 0 and $rand < 100), 'rand');
is($singleton->instance->{rand}, $rand, 'check rand');

# Тестируем одиночку для другого случая, когда  объект 
# хранится в локальной переменной метода instance_with_state.
my $another_singleton = Singleton->instance_with_state;
my $another_rand      = $another_singleton->{rand};

ok(($another_rand > 0 and $another_rand < 100), 'another_rand');
is($another_singleton->instance_with_state->{rand}, 
   $another_rand, 'check another rand');

done_testing;

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

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