2011-08-30 22 views
4

(這個問題是更多的誰有權訪問本書的人,很難把它放到上下文另有)四人幫的實現原型模式的

我已經通過了四人幫的「設計模式」閱讀這本書,有一句話讓我有點困惑,'Creational Patterns-> Prototype->示例代碼'(第124頁)。

接近頁面的底部,有一個BombedWall的implemententation,這是我的理解是一個具體的原型,因爲它從Wall繼承,並重新定義了Clone()虛函數。 BombedWall還定義了另一個方法,HasBomb(),對於使用常規Wall接口的任何客戶端是未知的。

BombedWall存儲在MazePrototypeFactory(原型客戶端)的唯一方法是爲Wall*(從BombedWall::Clone返回),唯一的方式去HasBomb()事後,據我瞭解,是垂頭喪氣上執行即Wall*BombedWall*(動態還是靜態,取決於我是否知道該類型),然後我可以訪問HasBomb()方法。

這一切對我來說都很好,但隨後作者說(同一頁,最後一句,第二個最後一段):

「客戶永遠也不應該的Clone返回值向下轉換 所需的類型」

什麼?那我該怎麼去HasBomb()

我必須失去了一些東西......

+1

[這裏](http://www.nileshgule.com/2012/06/prototype-design-pattern.html)是使用接口的原型設計模式的實現。即使沒有子類化,我們也可以通過使用原型對象來創建一個實例。 –

回答

1

我給了一個答案,完全改寫了,現在:)

基本上,MazePrototypeFactory只知道它可以使用的基類。它不知道任何你將要製作的任何子類,但它仍然應該能夠將任何可能的子類放到迷宮中。

該模式基本上確保MazeFactory將得到一個它可以理解的類型的指針Wall,而不是使MazeFactory需要被修改爲能夠產生所有子類的對象。

MazeFactory是第124頁提到的客戶端。它不需要了解HasBomb以建立迷宮。

0

我的猜測是,這種方法僅用於表明BombedWall是一個擴展的公共接口的不同類。 Hovewer,這個接口並沒有用在樣本的上下文中:迷宮構建算法沒有區分牆的類型,而其他子系統(例如渲染引擎)可能會這樣做。