1. 程式人生 > >Aha!設計模式(9)-抽象工廠(8)

Aha!設計模式(9)-抽象工廠(8)

程式碼示例

《設計模式》一書中關於程式碼示例的說明非常詳細,這裡不再重複原書中的內容。希望大家自己去讀一遍原著,然後再來閱讀本文的內容。

基本上每個設計模式的程式碼示例都會講一個故事,但是故事並不是設計模式的重點,它只是希望大家相信真的存在需要這個模式的場景。重要的還是類關係和程式碼。

利用者程式碼:

這段程式碼中建立了一個Maze物件,兩個Room物件和六個Wall物件,然後建立各個物件之間的聯絡。

工廠基類

和前面的例子中稍微有些區別的是,這裡的MazeFactory並不是抽象類,自己有實現程式碼,也可以構建產品:

測試程式碼

例項中通過如下程式碼將MazeGame,MazeFactory聯絡在一起。

它的輸出結果是:

派生工廠

接下來是派生工廠類,本例中一共有兩個:EnchantedMazeFactory和BombedMazeFactory。工廠類的類圖如下:

可以看到,兩個派生類只是覆蓋了基類的一部分操作,沒有實現的部分繼續沿用基類的功能。這是之前的例子中沒有過的。

這兩個派生工廠類的示例程式碼如下:

除了使用的工廠類不同以外,和test1完全相同。其輸出結果如下:

抽象工廠也不一定抽象,重要的是領會精神。

設計模式之外

想要真正把設計模式運用到開發中,往往還需要處理好另外一些問題,例如記憶體管理。我們回頭看看原書中的程式碼:

注意觀察SetSide呼叫的部分。

第一次呼叫時接受了factory.MakeWall()構建的Wall物件,由於這個物件沒有傳遞給其他的變數,所以wall物件的記憶體管理許可權應該交給r1;第二次呼叫時傳遞的是aDoor物件,這個物件除了傳遞給r1以外,後面又傳遞給r2。這個aDoor的記憶體應該由誰來管理呢?

為了解決這個問題,需要重新考慮記憶體管理的策略。例如所有物件的記憶體都交給aMaze物件管理,其他物件之間都是參照關係。這樣當然可以解決問題,但是比較繁瑣也不夠好玩,作者在這裡採用了另外的策略:使用C++11中的shared_ptr來解決問題。

單從形式上看,作者的實現和《設計模式》示例程式碼有以下區別:

  1. 所有的指標都被替換為自定義型別

  2. 建立物件是使用make_shared。

這裡的自定義型別就是智慧指標,例如WallPtr的定義為:

所有的變化都是因為使用了shared_ptr。

這樣操作的結果就是大大簡化了記憶體管理。在作者提供的這個示例中,由於記憶體管理全部交給shared_ptr進行,不再需要顯式釋放記憶體。

具體可以文末的下載連結。

參考連結:

示例程式碼:

https://github.com/xueweiguo/OOThinking/tree/master/Aha!DesignPattern/AbstractFactory/AbstractFactory

EA圖:

https://github.com/xueweiguo/OOThinking/blob/master/Aha!DesignPattern/Aha!DesignPattern.EAP

智慧指標shared_ptr(1)https://mp.weixin.qq.com/s/rreUOPpoNTvPWXLjgV_bsA

智慧指標shared_ptr(2)

https://mp.weixin.qq.com/s/3J1_nZNrDs5X-rw_XUw9UQ

智慧指標shared_ptr(3)https://mp.weixin.qq.com/s/hURdinSkkw960qD5Wq1YOA

注:

本文中藍色粗體文字都引自《設計模式》一書。                       

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】