为什么要使用工厂在Perl中包装构造函数?一个例子会有所帮助。
答案 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
和
答案 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;
}