模式的定義
將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
相同的方法,不同的執行順序,產生不同的事件結果時;
多個部件或零件,都可以裝配到一個對象中,但是產生的運行結果又不相同時;
產品類非常復雜,或者產品類中的調用順序不同產生了不同的效能,這個時候使用建造者模式非常合適;
實現源碼:
package com.dp.example.builder;
/**
* Computer產品抽象類, 為了例子簡單, 只列出這幾個屬性
*
* @author mrsimple
*
*/
public abstract class Computer {
protected int mCpuCore = 1;
protected int mRamSize = 0;
protected String mOs = "Dos";
protected Computer() {
}
// 設置CPU核心數
public abstract void setCPU(int core);
// 設置內存
public abstract void setRAM(int gb);
// 設置操作系統
public abstract void setOs(String os);
@Override
public String toString() {
return "Computer [mCpuCore=" + mCpuCore + ", mRamSize=" + mRamSize
+ ", mOs=" + mOs + "]";
}
}
package com.dp.example.builder;
/**
* Apple電腦
*/
public class AppleComputer extends Computer {
protected AppleComputer() {
}
@Override
public void setCPU(int core) {
mCpuCore = core;
}
@Override
public void setRAM(int gb) {
mRamSize = gb;
}
@Override
public void setOs(String os) {
mOs = os;
}
}
package com.dp.example.builder;
package com.dp.example.builder;
/**
* builder抽象類
*
*/
public abstract class Builder {
// 設置CPU核心數
public abstract void buildCPU(int core);
// 設置內存
public abstract void buildRAM(int gb);
// 設置操作系統
public abstract void buildOs(String os);
// 創建Computer
public abstract Computer create();
}
package com.dp.example.builder;
public class ApplePCBuilder extends Builder {
private Computer mApplePc = new AppleComputer();
@Override
public void buildCPU(int core) {
mApplePc.setCPU(core);
}
@Override
public void buildRAM(int gb) {
mApplePc.setRAM(gb);
}
@Override
public void buildOs(String os) {
mApplePc.setOs(os);
}
@Override
public Computer create() {
return mApplePc;
}
}
package com.dp.example.builder;
public class Director {
Builder mBuilder = null;
/**
*
* @param builder
*/
public Director(Builder builder) {
mBuilder = builder;
}
/**
* 構建對象
*
* @param cpu
* @param ram
* @param os
*/
public void construct(int cpu, int ram, String os) {
mBuilder.buildCPU(cpu);
mBuilder.buildRAM(ram);
mBuilder.buildOs(os);
}
}
/**
* 經典實現較為繁瑣
*
* @author mrsimple
*
*/
public class Test {
public static void main(String[] args) {
// 構建器
Builder builder = new ApplePCBuilder();
// Director
Director pcDirector = new Director(builder);
// 封裝構建過程, 4核, 內存2GB, Mac系統
pcDirector.construct(4, 2, "Mac OS X 10.9.1");
// 構建電腦, 輸出相關信息
System.out.println("Computer Info : " + builder.create().toString());
}
}
優點與缺點
良好的封裝性, 使用建造者模式可以使客戶端不必知道產品內部組成的細節;
建造者獨立,容易擴展;
在對象創建過程中會使用到系統中的一些其它對象,這些對象在產品對象的創建過程中不易得到。
會產生多余的Builder對象以及Director對象,消耗內存;
對象的構建過程暴露。