gpt4 book ai didi

perl - Moose 中的单例角色

转载 作者:行者123 更新时间:2023-12-04 12:24:58 25 4
gpt4 key购买 nike

我正在尝试使用 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 中,它似乎可以正常工作。这里发生了什么?

最佳答案

您正在保存所有类型的实例,而不是为每个类类型使用不同的实例。

这需要工厂设计模式,例如:

package MyApp::Factory;

my %instances;

# intantiates an object instance if there is none available,
# otherwise returns an existing one.
sub instance
{
my ($class, $type, @options) = @_;

return $instances{$type} if $instances{$type};
$instances{$type} = $type->new(@options);
}

如果你真的想要单例,请安装 MooseX::Singleton 而不是自己安装——如果你查看源代码,你会发现它占了很多边缘情况。但是,我建议不要将您的类(class)强制为单例,因为这会将控制权从类(class)本身中移除。相反,使用工厂(如上),因此调用者可以决定如何构造类,而不是强制所有消费者进入一个用例。

关于perl - Moose 中的单例角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3064803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com