在軟件系統中,有時需要創建一個復雜對象,並且這個復雜對象由其各部分子對象通過一定的步驟組合而成。。下面就以這個例子來展開建造者模式的介紹。
在這個例子中,電腦城的老板是直接與客戶(也就是指采購員)聯系的,然而電腦的組裝是由老板指揮裝機人員去把電腦的各個部件組裝起來,真真負責創建產品(這裡產品指的就是電腦)的人就是電腦城的裝機人員。理清了這個邏輯過程之後,下面就具體看下如何用代碼來表示這種現實生活中的邏輯過程:
Main( Director director = Builder b1 = Builder b2 = Computer computer1 = Computer computer2 = IList<> parts = List<> Add( Console.WriteLine( ( part Console.WriteLine(+part+ Console.WriteLine( Computer computer = computer.Add( computer.Add( Computer computer = computer.Add( computer.Add( }
上面代碼中都有詳細的注釋代碼,這裡就不過多解釋,大家可以參考代碼和注釋來與現實生活中的例子做對比,下圖展示了上面代碼的運行結果:
介紹完了建造者模式的具體實現之後嗎,下面具體看下建造者模式的具體定義是怎樣的。
建造者模式(Builder Pattern):將一個復雜對象的構建於它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者模式使得建造代碼與表示代碼的分離,可以使客戶端不必知道產品內部組成的細節,從而降低了客戶端與具體產品之間的耦合度,下面通過類圖來幫助大家更好地理清建造者模式中類之間的關系。
前面的設計模式在.NET類庫中都有相應的實現,那在.NET 類庫中,是否也存在建造者模式的實現呢? 然而對於疑問的答案是肯定的,在.NET 類庫中,System.Text.StringBuilder(存在mscorlib.dll程序集中)就是一個建造者模式的實現。不過它的實現屬於建造者模式的演化,此時的建造者模式沒有指揮者角色和抽象建造者角色,StringBuilder類即扮演著具體建造者的角色,也同時扮演了指揮者和抽象建造者的角色,此時建造模式的實現如下:
Product product = IList<> parts = List<> Add( ( part + part + Main(= =
StringBuilder類扮演著建造string對象的具體建造者角色,其中的ToString()方法用來返回具體產品給客戶端(相當於上面代碼中GetProduct方法)。其中Append方法用來創建產品的組件(相當於上面代碼中BuildPartA和BuildPartB方法),因為string對象中每個組件都是字符,所以也就不需要指揮者的角色的代碼(指的是Construct方法,用來調用創建每個組件的方法來完成整個產品的組裝),因為string字符串對象中每個組件都是一樣的,都是字符,所以Append方法也充當了指揮者Construct方法的作用。
到這裡,建造者模式的介紹就結束了,建造者模式(Builder Pattern),將一個復雜對象的構建與它的表示分離,使的同樣的構建過程可以創建不同的表示。建造者模式的本質是使組裝過程(用指揮者類進行封裝,從而達到解耦的目的)和創建具體產品解耦,使我們不用去關心每個組件是如何組裝的。
本專題中所有源碼: 建造者模式源碼