我什么时候应该使用工厂在Perl中包装构造函数?

时间:2010-03-30 23:06:02

标签: perl constructor factory

为什么要使用工厂在Perl中包装构造函数?一个例子会有所帮助。

2 个答案:

答案 0 :(得分:5)

您在任何其他OO语言中使用工厂的完全相同的原因。

请参阅http://en.wikipedia.org/wiki/Factory_method_pattern

  

工厂方法在库代码和工具包中很常见   需要创建可能由应用程序子类化的类型的对象   使用框架。

     

经常使用并行类层次结构   要求一个层次结构中的对象   能够创建适当的对象   来自另一个人。

     

使用工厂方法   允许测试驱动的开发   要进行测试的课程[2]。如果   这样一个类Foo创造了另一个   对象危险,不能放   在自动化单元测试下(也许是它   与生产沟通   数据库并不总是可用的,   然后创造危险物品   被放置在虚拟工厂中   类Foo中的方法createDangerous。   用于测试,TestFoo(的一个子类)   然后用虚拟创建Foo)   工厂方法createDangerous   重写以创建和返回   FakeDangerous,一个假的物体。单元   测试然后使用TestFoo来测试   Foo的功能没有招致   使用真实的副作用   危险物品。

有关Perl工厂模式的更多详细信息:

http://www.perl.com/pub/a/2003/08/15/design3.html

http://www.perldesignpatterns.com/?FactoryObject

答案 1 :(得分:5)

工厂的一个常见用途是在您不知道提前需要哪种类型时生成对象。工厂根据情况确定要调用的构造函数。

就像一个例子,假设您想创建一个类来下载文件,但您不知道如何获取文件。也许它是FTP,HTTP,SVN或其他东西。你有一个Downloader类,它接受任何类型的URL并给你一个对象:

 my $object = Downloader->new( $some_url );

您不知道此对象的类型,但您也不在乎。它创建的所有对象都知道如何响应store_in_directory,因此您在不知道特定对象类型的情况下调用该方法:

 $object->store_in_directory( $dir );

你去吧。 new工厂允许子类(或其他)创建$object。它使界面更简单,因为在应用程序级别,您不必担心选择正确的类。

Perl的一个很好的功能是你不必硬编码类名。您可以执行以下操作,使用在运行时定义的字符串来构建对象:

 sub new {
      my( $class, @args ) = @_;

      my $output_class = $class->choose_the_right_implementing_class;

      my $output_object = $output_class->new;
      }