2010-03-30 49 views
1

爲什麼使用工廠在Perl中包裝構造函數?一個例子會有所幫助。什麼時候應該使用工廠在Perl中封裝構造函數?

+2

嘿kivien,你似乎是新來的......我建議你讀的http://www.catb .org /〜esr/faqs/smart-questions.html在問更多問題之前? – Ether 2010-03-31 00:40:47

+3

我認爲這是一個很好的問題。它是那些哲學的高層次之一,而不是「解決我急迫的緊迫問題」類型。 – 2010-03-31 02:26:30

+0

@brian - 我必須不同意。就Perl問題而言,這是無用的。如果您不同意,那麼爲了證明我錯了,請執行以下心理實驗。如果在下一個小時的時間裏,我會在「我應該什麼時候以$語言使用$模式」的矩陣中發表200-1000個問題,您是否會覺得必須贊成所有200個或者至少爭辯他們應該都是即使你自己沒有時間這樣做,還是積極投票?如果不是,這個問題也不值得讚賞。 – DVK 2010-03-31 02:58:48

回答

5

您在其他OO語言中使用工廠的原因完全相同。

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

廠方法在工具包和框架,其中庫代碼 需要創建其可以通過使用框架的應用程序 作爲子類的類型的對象是共同的。

Parallel類層次結構往往 需要從一個層次到 對象能夠創建合適的對象從另一個 。

工廠方法用於 測試驅動開發,以允許 類進行測試[2]。如果 這種類Foo創建另一個 對象危險,不能把 下自動單元測試(或許 與生產 數據庫並不總是可用的通信),然後 危險對象 的創建被放置在虛擬工廠 方法中創建Foo類中的危險。 用於測試,然後創建TestFoo( Foo的子類),虛擬 工廠方法createDangerous 重寫以創建並返回 FakeDangerous,一個假對象。單元 測試然後使用TestFoo測試Foo的 功能,而不會產生 使用真實的副作用 危險對象。

Perl的工廠模式

進一步瞭解詳細:

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

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

5

一個常見的使用廠是一家以生產對象,當你不知道哪個鍵入你需要提前。工廠根據情況確定要調用哪個構造函數。

舉一個例子,假設您想創建一個類來下載文件,但事先並不知道如何獲取文件。也許它是FTP,HTTP,SVN或其他。你有一個下載器類,可以將任何類型的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; 
     } 
相關問題