Java設計模式4:建造者模式
一、什麼是建造者模式?
1、定義:
是將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
工廠類模式提供的是建立單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來建立複合物件,所謂複合物件就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。
2.模式講解:
1、Builder:給出一個抽象介面,以規範產品物件的各個組成成分的建造。這個介面規定要實現複雜物件的哪些部分的建立,並不涉及具體的物件部件的建立。 2、ConcreteBuilder:實現Builder介面,針對不同的商業邏輯,具體化複雜物件的各部分的建立。 在建造過程完成後,提供產品的例項。 3、Director(指揮者):呼叫具體建造者來建立複雜物件的各個部分,在指導者中不涉及具體產品的資訊,只負責保證物件各部分完整建立或按某種順序建立。 4、Product:要建立的複雜物件。
二、具體例項:
這裡以建造電腦為例子,為了簡便,我們這裡建造一臺電腦只主要cpu、主機板(MainBoad)、硬碟(HD)。
Computer:
/** * <pre> * @author : orange * @e-mail : [email protected] * @time : 2018/9/29 14:43 * @desc : 給出一個抽象介面,以規範產品物件的各個組成成分的建造 * @version: 1.0 * </pre> */ public interface ComputerBuilder { void buildCPU(); void buildMainBorad(); void buildHD(); //獲得一個組裝好的電腦 Computer getComputer(); }
要建立的複雜物件。
/** * <pre> * @author : orange * @e-mail : [email protected] * @time : 2018/9/29 14:39 * @desc : 定義一個具體的產品類 computer * @version: 1.0 * </pre> */ @Data public class Computer { //cpu private String CPU; //主機板 private String MainBorad; //硬碟 private String HD; }
ComputerBuilder:建造電腦的抽象介面
/**
* <pre>
* @author : orange
* @e-mail : [email protected]
* @time : 2018/9/29 14:43
* @desc : 給出一個抽象介面,以規範產品物件的各個組成成分的建造
* @version: 1.0
* </pre>
*/
public interface ComputerBuilder {
void buildCPU();
void buildMainBorad();
void buildHD();
//獲得一個組裝好的電腦
Computer getComputer();
}
ConcreteBuilder:建造電腦介面的具體實現類
/**
* <pre>
* @author : orange
* @e-mail : [email protected]
* @time : 2018/9/29 14:47
* @desc : 具體的建造者 實現ComputerBuilder介面
* @version: 1.0
* </pre>
*/
public class ConcreteBuilder implements ComputerBuilder {
private static Computer computer = new Computer();
@Override
public void buildCPU() {
computer.setCPU("cpu...");
}
@Override
public void buildMainBorad() {
computer.setMainBorad("MainBorad...");
}
@Override
public void buildHD() {
computer.setHD("HD..");
}
@Override
public Computer getComputer() {
return computer;
}
}
Director:呼叫具體建造者來建立複雜物件的各個部分
/**
* <pre>
* @author : orange
* @e-mail : [email protected]
* @time : 2018/9/29 14:53
* @desc : 組裝電腦
* @version: 1.0
* </pre>
*/
public class Director {
public Computer construct(ComputerBuilder computerBuilder){
computerBuilder.buildCPU();
computerBuilder.buildMainBorad();
computerBuilder.buildHD();
return computerBuilder.getComputer();
}
}
測試:
public class Test {
public static void main(String[] args) {
Director director = new Director();
Computer computer = director.construct(new ConcreteBuilder());
System.out.println(computer.getCPU());
}
}
總結:
優點:
易於解耦 將產品本身與產品建立過程進行解耦,可以使用相同的建立過程來得到不同的產品。也就說細節依賴抽象。
易於精確控制物件的建立 將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰
易於拓展 增加新的具體建造者無需修改原有類庫的程式碼,易於拓展,符合“開閉原則“。
缺點:
建造者模式所建立的產品一般具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,因此其使用範圍受到一定的限制。
如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大。