我正在尝试使用 Perl 和 Moose 编写单例角色。我知道 MooseX::Singleton 模块是可用的,但是当我们的项目需要另一个 CPAN 模块时总是会遇到阻力。在尝试了这个并遇到了一些麻烦之后,我想了解为什么我的方法不起作用。我写的单例角色如下:
package Singleton;
use Moose::Role;
my $_singleInstance;
around 'new' => sub {
my $orig = shift;
my $class = shift;
if (not defined $_singleInstance ){
$_singleInstance = $class->$orig(@_);
}
return $_singleInstance;
};
sub getInstance
{
return __PACKAGE__->new();
}
1;
当只有一个类使用单例角色时,这似乎有效。但是,当两个类(例如 ClassA 和 ClassB)都使用 Singleton 角色时,它会出现,因为它们都引用共享的 $_singleInstance 变量。如果我调用 ClassA->getInstance 它会返回对 ClassA 对象的引用。如果我稍后在同一个脚本中调用 ClassB->getInstance,它会返回对 ClassA 类型对象的引用(尽管我清楚地为 ClassB 调用了 getInstance 方法)。如果我不使用角色并将代码从 Singleton 角色复制并粘贴到 ClassA 和 ClassB 中,它似乎可以正常工作。这里发生了什么?