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來解決問題。
單從形式上看,作者的實現和《設計模式》示例程式碼有以下區別:
-
所有的指標都被替換為自定義型別
-
建立物件是使用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
注:
本文中藍色粗體文字都引自《設計模式》一書。
覺得本文有幫助?請分享給更多人。
閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】