在对象实例上调用new有什么好处?

时间:2009-10-25 16:48:41

标签: perl oop constructor factory-pattern

我正在阅读Programming Perl,我找到了这段代码:

sub new {
    my $invocant = shift;
    my $class   = ref($invocant) || $invocant;
    my $self = {
        color  => "bay",
        legs   => 4,
        owner  => undef,
        @_,                 # Override previous attributes
    };
    return bless $self, $class;
}

对于像这样的构造函数,在对象实例上调用new有什么好处?我认为这是它的用途,对吧?我的猜测是,如果有人想要编写这样的构造函数,他将不得不添加一些代码,将第一个对象的属性复制到即将创建的对象。

3 个答案:

答案 0 :(得分:12)

所以你可以在不知道原始类的对象是什么的情况下构造同一个类的另一个对象 - 这可以使一些非常简洁的紧凑工厂模式。

作为一个例子,当您需要构建资源对象时,这很有用,因为需要并且计算WHICH类资源对象的成本很高(比如,长时间运行的数据库查询)。因此,工厂会看到它是否传递了旧的资源对象,如果是,只需调用$old_object->new()就可以创建一个 - 避免重新计算资源类型的资源成本。

另一个例子是,如果你有一个表示动物的类层次结构,以及一个用于在模拟中构建新动物的工厂,你可以调用$newborn = $factory->make_new_animal($mother),工厂实现只是$object->new()

答案 1 :(得分:7)

我没有看到任何真正的好处。您可以随时ref($obj)->new或有方法$obj->clone;这样你就不会想知道那两个$object->new正在做什么。

答案 2 :(得分:5)

正如其他人所说,它是允许多态创建新对象实例而不必知道该实例的类型。

对于对象克隆,我通常编写可以正确复制属性和其他数据的显式clone()或copy()方法,但是没有理由说new()不能处理这个角色,只要它清楚地记录在案。但是,我认为分别定义它们有两个好处:

  1. 能够使用不同的类(孩子,或混合/角色(例如Moose角色))来覆盖各种行为
  2. 使代码更清晰的可能性,例如创建新“空”对象所需的步骤与克隆现有对象的步骤非常不同。