**示例
《設計模式》中的示例**因為不完整所以不能編譯,而且還有記憶體洩漏。它真的就是乙個示例。本文根據自己的理解將不足的補上,同時在使用智慧型指標消除記憶體洩漏的同時盡量小地變更原來的**。
首先是介面:
《設計模式》書中將實現**也寫在同乙個檔案中,這裡將它們分開:
這兩種方式區別不大。
接下來是使用builder的**:
將這個createmaze版本與原來的相比,注意生成器是如何隱藏迷宮的內部表示的 — 即定義房間、門和牆壁的那些類 — 以及這些部件是如何組裝成最終的迷宮的。有人可能猜測到有一些類是用來表示房間和門的,但沒有跡象顯示哪個類是用來表示牆壁的。這就使得改變乙個迷宮的表示方式要容易一些,因為所有mazebuilder的客戶都不需要被改變。
所謂原來的版本指的是抽象工程中使用的**:
可以看到,這段**中使用了各種各樣的類。而builder模式的**中這些類乙個也沒有出現。它們都被builder類封裝起來了。
可以在standmazebuilder**中找到原來**的影子。
這實際上就是重構。重構之後就可以通過實現其他的具象builder類來做一些有趣的事情,比如示例中的countingmazebuilder可以對操作進行計數等等。
還有一點
需要注意的是,mazebuilder通過使用房間號識別構建過程中的重要物件而不需要知道物件的型別。這也算是一種抽象。在運用builder模式的過程中,這種手法在大多數情況下是必須的。
作者觀點
builder模式中隱藏具體類的方法需要一定的想法和技巧。
物件導向的許多任務作看起來也不過就是將**移來移去,但是這種移動實現了重構,結果是得到了更好的程式結構。這不是小事情。
注:
本文中藍色粗體文字都引自《設計模式》一書。
Java設計模式(五) 建造者模式Builder
我們要建造乙個複雜的產品。比如 神舟飛船 iphone。這個複雜的產品的建立,有這樣乙個問題需要處理 要構建的物件,宇宙飛船 package com.iter.devbox.builder 宇宙飛船 author shearer public class airship public orbital...
Aha!設計模式 58 裝飾模式 2
示例 我們從前一篇文章中選取網路資料處理的例子寫一段python 中首先定義了資料處理基類dataprocessor,它有乙個process操作用於處理資料。datacreater是乙個普通的派生類,用於初始化資料。然後是decorator類,它定義了乙個資料成員processor,用於管理裝飾物件...
Aha!設計模式 78 命令模式 3
結構 參與者 協作 client建立乙個concretecommand物件並指定它的receiver物件。某invoker物件接收該concretecommand物件。invoker呼叫concretecommand物件的執行操作。concretecommand物件呼叫receiver的一些操作以執...