建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
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.html2. 《Java与模式》