Builder 模式 —— 建造者模式(又譯成生成器模式)的主要功能是構建復雜的產品,它是將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
舉個例子,打個生產電腦的比方,這里簡單一點,假設生產電腦只需要 CUP、內存和顯卡,現在需要生產宏基和戴爾兩個品牌的電腦,不用設計模式的實現:
Acer.java











































Dell.java











































Client.java







































仔細觀察一下上面的實現,不難發現,不管是生產何種品牌的筆記本,在實現的時候,它們的步驟基本上都是一樣的,都是生產電腦相應的部件并添加都電腦里面,在生產不同品牌電腦
的時候,都會重復處理這幾個步驟,但是明顯的是,這幾個步驟都是穩定的或者說是一樣的,只是每個步驟的具體實現不一樣或者說是變化的,如果將這些變化的部分抽取出來,也就是
說如果將處理過程與具體的步驟的實現分離開來的話,這樣就能夠復用這些處理過程,而且這樣一來就能很容易的做到在不同品牌電腦之間切換生產。
使用 Builder 模式的實現,如圖:

Product.java































Acer.java
















Dell.java
















Builder.java


























AcerBuilder.java








































DellBuilder.java








































Director.java


























Client.java




































后臺輸出:




在這里,Acer 類和 Dell 類是空的,如果是這種情況,那么它們可以省略掉,如果 Product 也不是最終想要的,那么它也可以被省略掉,最終剩下的就只有 Director、Builder、
和具體的 Bulider 實現類。
在這里,Acer 類和 Dell 類是有關系的兩個類,它們都是電腦的品牌之一,如果遇到兩個或多個沒有太多關系的類,假設 Acer 類代表電腦,Dell 類代表汽車,很明顯,Acer 類和
Dell 類就不應該再有共同的父類,也就是這種情況下,Product 這個抽象類不存在了,這時候問題就來了,那么 Builder 接口的規定的 getFinalResult() 方法的返回值怎么確定呢??
如果它的返回值類型是 Acer,那么 DellBuilder 類就會有問題,如果它的返回值類型是 Dell,那么 AcerBuilder 類就會有問題;
很明顯,這是由于類型不能正確匹配引起的,如果是這種情況,可以將 Product 設計成標識接口(空接口,接口里面沒有規定任何行為方法),再讓這些沒有相互關系的具體產品類
都去實現這個接口,那么 Builder 接口里面規定的 getFinalResult() 方法的返回值類型依然是 Product 類型,這樣一來問題就解決了。