建造者模式可以將一個(gè)產(chǎn)品的內(nèi)部表象與產(chǎn)品的生成過(guò)程分割開(kāi)來(lái),從而可以使一個(gè)建造過(guò)程生成具有不同的內(nèi)部表象的產(chǎn)品對(duì)象。

UML圖示:


1. com.cleversoft.designpatterns.builder2.PostalClert.java:
package?com.cleversoft.designpatterns.builder2;

public?class?PostalClert?{
????
public?void?construct(LetterBuilder?letterBuilder)?{
????????letterBuilder.buildEnvelop();
????????letterBuilder.buildStamp();
????}

}

2. com.cleversoft.designpatterns.builder2.LetterBuilder.java:
package?com.cleversoft.designpatterns.builder2;

public?abstract?class?LetterBuilder?{
????
public?abstract?void?buildEnvelop();

????
public?abstract?void?buildStamp();

????
public?abstract?Letter?getLetter();
}

3. com.cleversoft.designpatterns.builder2.OrdinaryMailBuilder.java:
package?com.cleversoft.designpatterns.builder2;

public?class?OrdinaryMailBuilder?extends?LetterBuilder?{
????
private?Letter?ordinaryMail?=?new?OrdinaryMail();

????
public?void?buildEnvelop()?{
????????ordinaryMail.add(
"ordinaryEnvelop",?0.1);
????}


????
public?void?buildStamp()?{
????????ordinaryMail.add(
"ordinaryStamp",?1.0);
????}


????
public?Letter?getLetter()?{
????????
return?ordinaryMail;
????}


}

4. com.cleversoft.designpatterns.builder2.RegisteredLetterBuilder.java:
package?com.cleversoft.designpatterns.builder2;

public?class?RegisteredLetterBuilder?extends?LetterBuilder?{
????
private?Letter?registeredLetter?=?new?RegisteredLetter();

????
public?void?buildEnvelop()?{
????????registeredLetter.add(
"registeredEnvelop",?2.0);
????}


????
public?void?buildStamp()?{
????????registeredLetter.add(
"registeredStamp",?15.0);
????}


????
public?Letter?getLetter()?{
????????
return?registeredLetter;
????}

}

5. com.cleversoft.designpatterns.builder2.Letter.java:
package?com.cleversoft.designpatterns.builder2;

public?interface?Letter?{

????
public?abstract?void?add(String?type,?double?price);

????
public?abstract?void?list();

}

6. com.cleversoft.designpatterns.builder2.OrdinaryMail.java:
package?com.cleversoft.designpatterns.builder2;

import?java.util.Enumeration;
import?java.util.Hashtable;

public?class?OrdinaryMail?implements?Letter?{
????Hashtable
<String,?Double>?letter?=?new?Hashtable<String,?Double>();

????
/*
?????*?(non-Javadoc)
?????*?
?????*?@see?com.cleversoft.designpatterns.builder2.ILetter#add(java.lang.String,
?????*??????double)
?????
*/

????
public?void?add(String?type,?double?price)?{
????????letter.put(type,?price);
????}


????
/*
?????*?(non-Javadoc)
?????*?
?????*?@see?com.cleversoft.designpatterns.builder2.ILetter#show()
?????
*/

????
public?void?list()?{
????????System.out.println(
"Ordinary?Letter?List\n");
????????Enumeration?keys?
=?letter.keys();
????????
while?(keys.hasMoreElements())?{
????????????String?key?
=?keys.nextElement().toString();
????????????String?value?
=?letter.get(key).toString();
????????????System.out.println(key?
+?"?"?+?value?+?"");
????????}


????}

}

7. com.cleversoft.designpatterns.builder2.RegisteredLetter.java:
package?com.cleversoft.designpatterns.builder2;

import?java.util.Enumeration;
import?java.util.Hashtable;

public?class?RegisteredLetter?implements?Letter?{
????Hashtable
<String,?Double>?letter?=?new?Hashtable<String,?Double>();

????
/*
?????*?(non-Javadoc)
?????*?
?????*?@see?com.cleversoft.designpatterns.builder2.ILetter#add(java.lang.String,
?????*??????double)
?????
*/

????
public?void?add(String?type,?double?price)?{
????????letter.put(type,?price);
????}


????
/*
?????*?(non-Javadoc)
?????*?
?????*?@see?com.cleversoft.designpatterns.builder2.ILetter#show()
?????
*/

????
public?void?list()?{
????????System.out.println(
"Registered?Letter?List\n");
????????Enumeration?keys?
=?letter.keys();
????????
while?(keys.hasMoreElements())?{
????????????String?key?
=?keys.nextElement().toString();
????????????String?value?
=?letter.get(key).toString();
????????????System.out.println(key?
+?"?"?+?value?+?"");
????????}


????}

}

8. com.cleversoft.designpatterns.builder2.Main.java:
package?com.cleversoft.designpatterns.builder2;

public?class?Main?{

????
public?static?void?main(String[]?args)?{
????????LetterBuilder?lb?
=?new?OrdinaryMailBuilder();
????????PostalClert?pc?
=?new?PostalClert();
????????pc.construct(lb);

????????Letter?l?
=?lb.getLetter();
????????l.list();
????}

}


參考資料:
1. http://terrylee.cnblogs.com/archive/2005/12/19/299878.html
2. 《Java與模式》

歡迎大家訪問(wèn)我的個(gè)人網(wǎng)站 萌萌的IT人