???? 設(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