2010-07-16 67 views
2

我剛剛閱讀了一本關於面向對象編程模式的書。它描述了一個Factory模式,通過該模式你可以調用一個對象的靜態工廠方法,並且該對象將返回一個新的期望類型的對象,但它會被適當的子類化。如何使構造函數返回一個子類對象

我的問題,該功能可以由類的構造函數提供?如果是這樣如何?我不是爲什麼?想象一下,我有一個名爲VillagePerson的課程,它有警務官,NativeAmerican,Cowboy,Biker,ConstructionWorker和Sailor的子類。構造函數接受一個人的文本字符串描述,解析它,並返回我想要的特定類型的人。這僅適用於靜態工廠方法嗎?

+0

此問題的答案是語言特定的。 – rwong 2010-07-16 15:05:43

回答

1

這是史蒂芬Sudit的評論的大意

VillagePerson頂部創建一個Proxy類:

  • 該代理實現相同的接口VillagePerson,但沒有繼承任何實現代碼從中。
  • 代理包含參考_vpImpl到子類別VillagePerson對象。
  • 當在代理上調用某個方法時,代理只需將該調用傳遞給_vpImpl對象。

要構造一個子類VillagePerson,代理的構造函數可以調用子類的特定構造函數,然後將其存儲在_vpImpl

+0

聰明。似乎有很多工作想法。 – JnBrymn 2010-07-16 16:00:27

+0

這是對史蒂文蘇提特的評論的解釋。 – rwong 2010-07-16 17:01:40

3

號通常,一個構造是由該語言自動調用到函數初始化正被創建的對象。這本身就意味着工廠的「調用我創建對象」功能不能由構造函數提供。

此外,構造函數通常從諸如new ClassName(args)等表達式中調用,這些表達式在大多數語言中定義爲創建ClassName的實例,而不是從ClassName繼承的類。所以,你不能使用new或構造函數來創建任何類型的實例。另一方面,我的確在大多數語言中說「:有些像JavaScript一樣,可以讓你從構造函數中返回任何你想要的東西,而Objective Caml等其他東西可以把構造函數當作工廠函數。

+0

+1關於動態類型語言的警告 – MikeD 2010-07-16 14:53:13

+3

您的答案是正確的,但即使在靜態類型語言中,也可以通過多種方法來近似動態類型。例如,'VillagePerson'構造函數可以調用'VillagePersonImplFactory'靜態工廠方法來初始化其'_vpImpl'成員。然後,當它的'Dance'方法被調用時,它可以將調用鏈接到'_vpImpl'。我確定GoF設計模式書有這樣的官方標籤;我想到一些關於模板的東西 – 2010-07-16 15:02:18

+0

@Steven Sudit:是的。不過,我發現使用工廠方法更容易。 – 2010-07-16 15:29:20

相關問題