2010-03-26 117 views
30

我看到經常出現的單詞,而且隨着時間的推移,我可能自己在代碼和庫中使用它,但我從來沒有真正懂過。在我遇到的大多數寫作中,他們只是繼續期待你找出答案。班級工廠究竟是什麼?

什麼是班級工廠?有人可以解釋這個概念嗎?

回答

12

類工廠構造其他類的實例。通常,它們創建的類共享一個公共基類或接口,但返回派生類。

例如,你可以有一個類工廠,把數據庫連接字符串,返回執行IDbConnection這樣SqlConnection(類和接口的.NET)

5

類工廠是一種方法,根據一些參數(例如)返回給您一個自定義的類(未實例化!)。

1

我覺得這解釋得很好(對我來說,無論如何)。我認爲,工廠設計模式中使用了類工廠。

像其他創建模式,它[工廠設計模式] 涉及沒有指定 確切類對象,這將是 創建的創建 對象(產品)的問題。工廠方法設計 圖案由 限定用於 一個單獨的方法創建的對象,子類則 可以覆蓋到指定將 創建產品的 派生類型處理這個問題。更一般地說,術語 工廠方法通常用於將 引用到其主要目的是創建對象的任何方法。

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

道歉,如果您已經閱讀了這一點,並發現它是不夠的。

25

這裏有一些額外的信息,可以幫助我們更好地理解其他技術上正確但短的答案。

從最嚴格的意義上講,類工廠是一種函數或方法,它根據從輸入參數或全局上下文中確定的某些條件創建或選擇一個類並將其返回並返回。當需要對象的類型直到運行時才能確定時,這是必需的。當類本身就是所用語言的對象時,可以直接完成實現,比如Python。由於任何類的主要用途都是用類似C++的語言來創建它自己的實例,其中類不是可以傳遞和操作的對象,所以類似的結果通常可以通過模擬「虛擬構造函數」來實現,你調用一個基類構造函數,但返回一個派生類的實例。這必須被模擬出來,因爲構造函數不能真正在C++中使用,這就是爲什麼這樣的對象而不是類工廠通常被實現爲獨立函數或靜態方法的原因。

虛擬函數通常解決「late」通過引用的實際類型的對象,但在構造的情況下,該對象不存在,所以類型必須通過一些其它手段來確定。

最好的實現方式是那些在添加新候選類時自動處理新候選類的方法,而不是僅將當前硬編碼到工廠中的某個有限集合(儘管如果工廠是唯一需要的工廠修改)。

James Coplien的1991年書Advanced C++: Programming Styles and Idioms詳細介紹了在C++中實現這種虛擬泛型構造函數的一種方法。使用C++ templates還有更好的方法來做到這一點,但是這本書並沒有在它們被添加到標準語言定義之前被覆蓋。實際上,C++模板本身就是類工廠,因爲它們在與不同的實際類型參數一起使用時會實例化一個新類。 更新:我找到了他爲EuroPLoP撰寫的1998年論文,標題爲C++ Idioms,其中包括他將書中的習語修改並重新組合成1994年的Design Patterns: Elements of Re-Usable Object-Oriented Software書中的設計模式。特別注意Virtual Constructor部分(使用他的Envelope/Letter模式結構)。

另請參閱相關答案Class factory in Python。另請參閱Abstract Factory, Template Style這是2001年Dobb博士的文章,也是關於使用C++模板實現它們的文章。