一、概念
将一個複雜對象的建構過程和它的表示分離,使得相同的建構過程建立不同的表示。
二、UML類圖
UML類圖如下圖所示。
角色介紹:
Product産品類-産品的抽象類
Builder-抽象的Builder類,規範産品的組建,一般是由子類實作具體的組建過程;
ConcreteBuilder——具體的Bilder類;
Director——統一組裝過程
三、使用場景
1、相同的方法,不同執行順序,産生不同的事件結果時。
2、多個部件或零件,都可以裝配到同一個對象,但是産生運作結果又不相同時。
3、産品類非常複雜,或者産品類地中的調用順序不同産生不同的作用,這個時候使用非常合适。
4、當初始化一個對象非常複雜,如參數多,且很多的參數都具有預設值。
四、代碼實作
public abstract class Computer {
protected String mBroad;
protected String mDisplay;
protected String mOS;
protected Computer() {
}
public void setmBroad(String mBroad) {
this.mBroad = mBroad;
}
public void setmDisplay(String mDisplay) {
this.mDisplay = mDisplay;
}
public abstract void setmOS();
@Override
public String toString() {
return "Computer [mBroad=" + mBroad + ", mDisplay=" + mDisplay
+ ", mOS=" + mOS + "]";
}
}
public class MacBook extends Computer {
@Override
public void setmOS() {
mOS = "Mac os x 12";
}
}
public abstract class Builder {
// 設定主機
public abstract void setBuilderBoard(String borad);
// 設定顯示器
public abstract void setBuilderDisplay(String display);
// 設定作業系統
public abstract void setBuilderOS();
// 建立計算機
public abstract Computer createComputer();
}
public class MacBuilder extends Builder {
private Computer maComputer = new MacBook();
@Override
public void setBuilderBoard(String borad) {
maComputer.setmBroad(borad);
}
@Override
public void setBuilderDisplay(String display) {
maComputer.setmDisplay(display);
}
@Override
public void setBuilderOS() {
maComputer.setmOS();
}
@Override
public Computer createComputer() {
// TODO Auto-generated method stub
return maComputer;
}
}
public class Director {
Builder mBuilder = null;
public Director(Builder builder) {
mBuilder = builder;
}
public void construct(String borad, String display) {
mBuilder.setBuilderBoard(borad);
mBuilder.setBuilderDisplay(display);
mBuilder.setBuilderOS();
}
}
public class Test {
public static void main(String[] args) {
Builder macBook = new MacBuilder();
Director director = new Director(macBook);
director.construct("英特爾", "Retina顯示器");
System.out.println(macBook.createComputer());
}
}
五、總結
優點:
1、良好的封裝性,可以使用戶端不用知道産品内部組裝的過程。
2、建造者獨立,可擴充性強。
缺點:
會産生多餘的Builder對象和Director對象,消耗記憶體