???? 設計模式放了一段時間了,今天學習了生成器模式。

???? 名稱:生成器模式。
???? 意圖:它一個復雜的對象與他的構造相分離,使得同樣的構造過程可以創建不同的表示。
???? 適用環境:
??????????????????它創建復雜對象的算法,應該獨立于該對象的組成部分及它們的裝配方式。
?????????????????? 當構造過程必須允許被構造的對象有不同的表示時。(單單這兩話我沒有完全理解,就像很多高人說學習設計模式比成是修煉內功,難點就是如何在實際開發中運用。)

???? 它的特點:Builder模式是一步一步創建一個復雜的對象,它允許用戶可以只通過指定復雜對象的類型和內容就可以構建它們.用戶不知道內部的具體構建細節.Builder模式是非常類似抽象工廠模式,細微的區別大概只有在反復使用中才能體會到。
??? ?例如:一座房子,它有很多部件:房間、窗戶;還有門窗上的鎖和窗戶上的插銷等小零件。Builder模式的目的就是為了將部件(門、窗等)和組裝過程(整個房子的建造)分開。

?

現在假設一個房子有多個部件組成的, Builder 模式的目的是把復雜對象的創建和部件的創建分別開來。分別用 Builder 類和 Director 類來表示。


??首先定義一個房子的部件接口:

? 代碼清單1:房子(House)的部件
?
package?builder;
public?interface?Builder{
????????
//構造房子部件--門
????public?void?buildDoors(int?dCount);
????
//構造房子部件--窗戶
????????public?void?buildWindows(int?wCount);
????
???????
//返回最后組裝成品結果?(返回最后裝配好的汽車)
 ???
//成品的組裝過程不在這里進行,而是轉移到下面的Director類中進行.

????House?getHouse();
}


代碼清單2:Director類用來構建最后的復雜對象房子House
package?builder;
public?class?Director{

????
private?Builder?builder;

????
public?Director(Builder?builder){
????????
this.builder=builder;
????}


???????
//?將部件Door,window最后組成復雜對象House的過程
  ????????public?void?constructor(){
????????builder.buildDoors(
1);
????????builder.buildWindows(
2);
????}

}


代碼清單3:Builder的具體實現ConcreteBuilder類
package?builder;
public?class?ConcreteBuilder?implements?Builder{
????
private?int?doorCount;
????
private?int?windowCount;
????????
????????
//這里是具體如何構建門door
????public?void?buildDoors(int?doorCount){
????????
this.doorCount=doorCount;
????}


????????
//這里是具體如何構建窗戶window
????public?void?buildWindows(int?windowCount){
????????
this.windowCount=windowCount;
????}

?
????????
//返回最后組裝成品結果
????public?House?getHouse(){
????????
return?new?House(doorCount,windowCount);
????}

}


代碼清單4:復雜對象-----產品房子
package?builder;
public?class?House{
????
????
private?int?doorCount,windowCount;
????
public?House(int?doorCount,int?windowCount){
????????
this.doorCount=doorCount;
????????
this.windowCount=windowCount;
????}

????????
????
public?String?toString(){
????????
return?"Constructor?House:door?Count="+doorCount+",window?count="+windowCount;
????}

}
?

代碼清單5:Builder模式的具體運用
package?builder;
public?class?BuilderPattern{

????
public?static?void?main(String[]?args){
????????ConcreteBuilder?builder
=new?ConcreteBuilder();
????????Director?director
=new?Director(builder);
????????
????????????????director.constructor();
????????House?house
=builder.getHouse();
????????System.out.println(house);
????}

}


最后的輸出結果如下:
? Constructor House:door Count=1,window count=2
? Press any key to continue...

由于本人沒有學過UML,所以沒有畫出相應的UML類,準備在學習設計模式后再學習UML。
?

參考文章:1.http://blog.csdn.net/qutr/archive/2006/07/24/967906.aspx
??????????????????? 2.http://www.jdon.com/designpatterns/builder.htm
??????????????????? 3.http://www.lvjiyong.com/books/DesignPatterns/13.html