6

我一直在尝试以多种方式做到这一点,但它们似乎都不够优雅。(我也想知道 CPAN 或 Moose 是否已经有了这个。随着时间的推移,我进行的数十次搜索都没有显示出完全匹配的内容。)

我想创建一种类

  • 是其他类的 Base + Facade + Factory,它们将自身加载为目标类型。
  • “工厂”是公正Base->new( %params )的,它根据各个子类注册的策略创建类型。
  • 每个子类都知道有关Base 类的基本信息,但我试图将其保持在最低限度。看下面的例子:UnresolvedPath只知道我们应该首先检查是否存在。

最明显的例子是文件系统目录和文件:

package Path;
use Moose;

...

sub BUILD { 
    my ( $self, $params ) = @_;
    my $path = $params->{path};

    my $class_name;
    foreach my $test_sub ( @tests ) { 
        $class_name = $test_sub->( $path );
        last if $class_name;
    }
    croak "No valid class for $path!" unless defined $class_name;
    $class_name->BUILD( $self, $params );
}

package Folder; 
use Moose;

extends 'Path';

use Path register => selector => sub { -d $_[0] };

sub BUILD { ... }

package UnresolvedPath; 

extends 'Path';

use Path register position => 1, selector => sub { !-e $_[0] };
  • 问题:Moose 是否为此提供了一个优雅的解决方案?还是我必须进入 Class::MOP 才能批量购买?
4

2 回答 2

3

查看http://code2.0beta.co.uk/moose/svn/MooseX-AbstractFactory/并随意窃取。(矿。)

于 2009-03-16T17:37:33.323 回答
2

如果你真的想做构建器模式抽象工厂模式,那么你可以这样做,没有什么能阻止你。但也许你真正需要的是控制反转/依赖注入?为此,您可以查看面包板

于 2009-03-16T17:01:35.000 回答