???? 設(shè)計模式放了一段時間了,今天學(xué)習(xí)了生成器模式。

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

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

?

現(xiàn)在假設(shè)一個房子有多個部件組成的, Builder 模式的目的是把復(fù)雜對象的創(chuàng)建和部件的創(chuàng)建分別開來。分別用 Builder 類和 Director 類來表示。


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

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

????House?getHouse();
}


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

????
private?Builder?builder;

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


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

}


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


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

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

}


代碼清單4:復(fù)雜對象-----產(chǎn)品房子
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模式的具體運(yùn)用
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);
????}

}


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

由于本人沒有學(xué)過UML,所以沒有畫出相應(yīng)的UML類,準(zhǔn)備在學(xué)習(xí)設(shè)計模式后再學(xué)習(xí)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