【发布时间】:2010-11-03 07:04:41
【问题描述】:
我正在寻找以下模式。 (我在 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;
}
【问题讨论】:
标签: perl inheritance constructor design-patterns creation