【问题标题】:When should I use a factory to wrap a constructor in Perl?什么时候应该使用工厂在 Perl 中包装构造函数?
【发布时间】:2010-03-30 23:06:02
【问题描述】:

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

【问题讨论】:

  • 嗨,kivien,你似乎是新来的……我建议你在问更多问题之前先阅读catb.org/~esr/faqs/smart-questions.html 吗?
  • 我认为这是一个很好的问题。它是一种哲学的、高层次的,而不是“解决我眼前的问题紧迫”的类型。
  • @brian - 我一定不同意。就 Perl 问题而言,它是无用的。如果您不同意,那么为了证明我错了,请进行以下心理实验。如果在接下来的一个小时内,我在“我什么时候应该在 $language 中使用 $pattern”的矩阵中发布 200 到 1000 个问题,你会觉得有必要对所有 200 个问题进行投票,或者至少争辩说它们都应该是即使您自己没有时间投票也赞成?如果不是,这个问题也不值得赞成。
  • 唯一值得讨论的问题是“我将 XYZ 视为工厂模式的用例,但 Perl 本身提供 ABC 方法来解决该用例而不是工厂。是否这意味着工厂模式在 Perl 中没有用例”?或者,不那么聪明,至少问“工厂模式是否有任何 Perl 特定的用例?”根据 OP 的其他帖子,这更有可能是一个家庭作业 Q,而不是关于生命、宇宙和地球意义的深刻哲学问题。
  • 您认为这是一个值得回答的问题。 耸耸肩。不过,这是您的心理实验的答案。发布数百个问题与这位新用户提出的一个问题之间的区别在于,他实际上想要一个答案,而您只是想成为一个混蛋。

标签: perl constructor factory


【解决方案1】:

与您在任何其他 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

【讨论】:

    【解决方案2】:

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

    举个例子,假设您想创建一个类来下载文件,但您不提前知道如何获取文件。可能是 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;
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多