爲什麼使用工廠在Perl中包裝構造函數?一個例子會有所幫助。什麼時候應該使用工廠在Perl中封裝構造函數?
回答
您在其他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
和
一個常見的使用廠是一家以生產對象,當你不知道哪個鍵入你需要提前。工廠根據情況確定要調用哪個構造函數。
舉一個例子,假設您想創建一個類來下載文件,但事先並不知道如何獲取文件。也許它是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;
}
- 1. 什麼是複製構造函數,什麼時候應該在C#中使用?
- 2. 什麼時候應該將構造函數設置爲constexpr?
- 3. 什麼時候注入構造函數,什麼時候是CDI
- 4. 什麼時候應該使用工廠模式?
- 5. 什麼時候應該使用抽象工廠模式
- 6. 什麼時候使用構造函數,何時使用OnInit
- 7. 什麼時候應該使用syscall函數代替glibc包裝?
- 8. 什麼時候應該在jquery函數中使用return false?
- 9. 什麼時候應該在模板函數中使用typename?
- 10. 什麼時候在嵌套類中調用構造函數(Java)
- 11. 什麼時候在cpp中調用拷貝構造函數?
- 12. 在C#中,什麼時候應該使用一個結構,什麼時候應該使用一個類?
- 13. 什麼時候應該使用call()直接調用該函數?
- 14. 什麼時候使用私有構造函數有用?
- 15. 什麼時候應該封裝泛型類型?
- 16. 什麼時候應該使用AWS,什麼時候不使用
- 17. 什麼時候應該使用sed,什麼時候應該使用awk
- 18. 什麼時候應該使用memcpy,什麼時候應該使用memmove?
- 19. 什麼時候應該使用Import-Package,什麼時候應該使用Require-Bundle?
- 20. 什麼時候調用SignalR中心構造函數?
- 21. 什麼時候在C++中生成默認構造函數
- 22. 飛鏢工廠(構造函數)與靜態方法;例如,爲什麼int.parse()不是工廠構造函數?
- 23. 什麼時候應該使用async/await,什麼時候不用?
- 24. 什麼時候應該使用PostgreSQL中
- 25. 什麼時候在C++中使用'new'運算符調用構造函數?
- 26. 什麼時候我們不應該在構造函數中使用初始化列表?
- 27. Typescript(Angular2)通用構造函數工廠
- 28. 什麼時候應該使用工廠方法模式? (而不是組合物)
- 29. 什麼是封裝()中的類型,我應該在什麼時候使用它? Golang
- 30. 什麼時候應該使用Perl的AUTOLOAD?
嘿kivien,你似乎是新來的......我建議你讀的http://www.catb .org /〜esr/faqs/smart-questions.html在問更多問題之前? – Ether 2010-03-31 00:40:47
我認爲這是一個很好的問題。它是那些哲學的高層次之一,而不是「解決我急迫的緊迫問題」類型。 – 2010-03-31 02:26:30
@brian - 我必須不同意。就Perl問題而言,這是無用的。如果您不同意,那麼爲了證明我錯了,請執行以下心理實驗。如果在下一個小時的時間裏,我會在「我應該什麼時候以$語言使用$模式」的矩陣中發表200-1000個問題,您是否會覺得必須贊成所有200個或者至少爭辯他們應該都是即使你自己沒有時間這樣做,還是積極投票?如果不是,這個問題也不值得讚賞。 – DVK 2010-03-31 02:58:48