Одиночка используется когда необходим ровно один экземпляр какого-то класса, доступный для остальных элементов программы.
Два примера реализации:
и тестирование для них:
Два примера реализации:
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;
Комментариев нет:
Отправить комментарий