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

kiv*_*ien 1 perl constructor factory

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

DVK*_*DVK 5

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

http://en.wikipedia.org/wiki/Factory_method_pattern

工厂方法在工具包和框架中很常见,其中库代码需要创建类型的对象,这些类型可以由使用框架的应用程序进行子类化.

并行类层次结构通常要求来自一个层次结构的对象能够从另一个层次结构创建适当的对象.

工厂方法用于测试驱动开发,以允许类进行测试[2].如果这样的类Foo创建另一个不能置于自动单元测试下的对象Dangerous(也许它与一个并不总是可用的生产数据库进行通信),那么Dangerous对象的创建将被放置在虚拟工厂方法createDangerous中Foo级.为了进行测试,然后创建TestFoo(Foo的子类),重写虚拟工厂方法createDangerous以创建并返回假对象FakeDangerous.单元测试然后使用TestFoo测试Foo的功能,而不会产生使用真正Dangerous对象的副作用.

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

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

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


bri*_*foy 5

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

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

 my $object = Downloader->new( $some_url );
Run Code Online (Sandbox Code Playgroud)

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

 $object->store_in_directory( $dir );
Run Code Online (Sandbox Code Playgroud)

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

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

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

      my $output_class = $class->choose_the_right_implementing_class;

      my $output_object = $output_class->new;
      }
Run Code Online (Sandbox Code Playgroud)