對Java建造者模式(Builder)的一點理解
一,Builder模式介紹
Builder模式是一步一步建立一個複雜物件的建立型模式,它允許使用者在不知道內部建造細節的情況下,可以更精細的控制物件的構造流程。該模式是為了將構建複雜物件的過程和它的部件解耦,是的構建過程和不見得表示隔離開來。
因為一個複雜的物件有很多大量組成部分,如電腦,有主機,顯示器,作業系統,還有各種小零件等,如何將這些不見組建成一臺電腦,這個裝配過程很漫長,也很複雜,為了在構建過程中對外部隱藏實現細節,就可以使用Builder模式將部件和組裝過程分離,使得構建過程和部件都可以自由擴充套件,兩者之間的耦合也降到最低。
二,Builder模式的定義
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
三,Builder模式的使用場景
(1)相同的方法,不同的執行順序,產生不同的事件結果。
(2)對各部件或零件,都可以配到一個物件中,但是產生的執行結果又不相同時。
(3)產品類非常複雜,或者產品類中的呼叫順序不同產生了不同的結果,這個時候使用建立者模式非常合適。
(4)當初始化一個物件特別複雜,如引數多,且很多引數都有預設值時。
四,Builder模式的UML類圖
五,Builder模式簡單例項
(1)電腦的抽象類
public abstract class Computer {protected String board;
protected String display;
protected String os;
//構造方法
protected Computer(){
}
//設定主機板
protected void setBoard(String board){
this.board = board;
}
//設定顯示器
protected void setDisplay(String display){
this.display = display;
}
//設定作業系統
protected abstract void setOs();
public String toString() {
return "computer[board="+board+",display="+display+",os="+os+"]";
}
}
(2)具體的蘋果電腦類,macBook
public class MacBook extends Computer {
protected MacBook() {
}
protected void setOs() {
os = "Mac OS X 10.10";
}
}
(3)抽象Builder類
public abstract class Builder {
// 設定主機
public abstract void builderBoard(String board);
// 設定顯示器
public abstract void builderDisplay(String display);
// 設定作業系統
public abstract void buildOS();
// 建立Computer
public abstract Computer create();
}
(4)具體的Builder類 MacBookBuilder
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
public void builderBoard(String board) {
// TODO Auto-generated method stub
computer.setBoard(board);
}
public void builderDisplay(String display) {
// TODO Auto-generated method stub
computer.setDisplay(display);
}
public Computer create() {
// TODO Auto-generated method stub
return computer;
}
public void buildOS() {
computer.setOs();
}
}
(5)Director類,負責構造電腦Computer
public class Director {
Builder builder = null;
public Director(Builder builder){
this.builder = builder;
}
public void construct(String board,String display){
builder.builderBoard(board);
builder.builderDisplay(display);
builder.buildOS();
}
}
(6)測試Test類
public class Test {
public static void main(String args[]){
//構造器
Builder builder = new MacBookBuilder();
Director pcDirector = new Director(builder);
//封裝構建過程
pcDirector.construct("intel主機板", "三星顯示器");
//輸出資訊
System.out.println(builder.create().toString());
}
}
(7)測試結果
六:總結
(1),良好的封裝性,不必知道內部組成的細節。
(2),建造者獨立,容易擴充套件。
(3),產生多餘的builder物件以及director物件,消耗記憶體。