我正在寻找以下模式。(我在 Perl 工作,但我认为该语言并不特别重要)。
有一个父类 Foo,以及子类 Bar、Baz、Bazza。
构造 Foo 的方法之一是解析字符串,该字符串的一部分将隐式指定要创建的类。例如,如果它以 'http:' 开头,那么它是一个 Bar,但如果它不是,但它包含 '[Date]',那么 Baz 喜欢它,依此类推。
现在,如果 Foo 知道它的所有子节点,以及什么是 Bar,什么是 Baz 等,它可以调用适当的构造函数。但是基类不应该对其子类有任何了解。
我想要的是 Foo 的构造函数能够依次尝试它的孩子,直到其中一个说“是的,这是我的,我会创造这个东西”。
我意识到在一般情况下这个问题没有明确定义,因为可能有不止一个孩子会接受字符串,所以他们被称为的顺序很重要:忽略这个并假设字符串的特征这样只有一个子类会喜欢该字符串。
我想出的最好的方法是让子类在初始化时向基类“注册”,以便它获取构造函数列表,然后遍历它们。但是我错过了更好的方法吗?
示例代码:
package Foo;
my @children;
sub _registerChild
{
push @children, shift();
}
sub newFromString
{
my $string = shift;
foreach (@children) {
my $object = $_->newFromString(@_) and return $object;
}
return undef;
}
package Bar;
our @ISA = ('Foo');
Foo::_registerChild(__PACKAGE__);
sub newFromString
{
my $string = shift;
if ($string =~ /^http:/i) {
return bless(...);
}
return undef;
}