使用場景
我們需要構建一個複雜的產品。比如:電腦,手機,飛船。這個複雜產品的創建,有這樣一個問題需要處理:裝配子組件是不是需要特定的步驟?
實際開發中,我們所需要的對象構建時,也非常複雜,有很多步驟需要處理時,我們就可能需要想到建造者模式。
建造者模式的本質
建造者模式又稱生成器模式,建造者模式分離了對象子組件的單獨構造(由builder來負責)和裝配(由director負責)。從而可以構造出複雜的對象。這個模式適用於:某個對象的構造過程比較複雜的時候。
由於實現了構建和裝配的解耦,不同的構造器,相同的裝配可以做出不同的對象;相同的構造器,不同的裝配也可以做出不同的對象。也就是實現了構建算法、裝配算法的解耦,實現了更好的複用。
創建者模式的優點:將一個復對象的創建過程封裝起來。允許對象通過多個步驟來創建,並且可以改變過程(這和只有一個步驟的工廠模式不同)。向客戶隱藏產品內部的實現。產品的實現可以被替換,因爲客戶只看到一個抽象的接口。
建造者模式demo
我們需要一臺臺式機,這臺臺式機由顯示器、主機、鼠標、鍵盤組成。具體代碼如下:
public class Computer {
//顯示器
private Monitor monitor;
//主機
private Host host;
//鍵盤
private Keyboard keyboard;
//鼠標
private Mouse mouse;
public void open(){
System.out.println("打開電腦!");
}
public Monitor getMonitor() {
return monitor;
}
public void setMonitor(Monitor monitor) {
this.monitor = monitor;
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
public Keyboard getKeyboard() {
return keyboard;
}
public void setKeyboard(Keyboard keyboard) {
this.keyboard = keyboard;
}
public Mouse getMouse() {
return mouse;
}
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
}
public class Monitor {
private String name;
public Monitor(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Host {
private String name;
public Host(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Keyboard {
private String name;
public Keyboard(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Mouse {
private String name;
public Mouse(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public interface ComputerBuilder {
Monitor buildMonitor();
Keyboard buildKeyboard();
Host buildHost();
Mouse buildMouse();
}
public class TestComputerBuilder implements ComputerBuilder {
@Override
public Monitor buildMonitor() {
System.out.println("構建顯示器");
return new Monitor("顯示器");
}
@Override
public Host buildHost() {
System.out.println("構建主機");
return new Host("主機");
}
@Override
public Keyboard buildKeyboard() {
System.out.println("構建鍵盤");
return new Keyboard("鍵盤");
}
@Override
public Mouse buildMouse() {
System.out.println("構建鼠標");
return new Mouse("鼠標");
}
}
public interface ComputerDirector {
/**
* 組裝電腦
* @return
*/
Computer dircetComputer();
}
public class TestComputerDirector implements ComputerDirector {
private ComputerBuilder computerBuilder;
public TestComputerDirector(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
@Override
public Computer dircetComputer() {
Monitor monitor = computerBuilder.buildMonitor();
Keyboard keyboard = computerBuilder.buildKeyboard();
Host host = computerBuilder.buildHost();
Mouse mouse = computerBuilder.buildMouse();
//裝配成臺式機
Computer computer = new Computer();
computer.setHost(host);
computer.setKeyboard(keyboard);
computer.setMonitor(monitor);
computer.setMouse(mouse);
return computer;
}
}
public class Client {
public static void main(String[] args) {
ComputerDirector director = new TestComputerDirector(new TestComputerBuilder());
Computer c = director.dircetComputer();
System.out.println(c.getKeyboard());
c.open();
}
}
運行結果如下:
類圖
這裏將Keyboard、Host、Monitor、Mouse四個類省略了,不然生成的類圖十分龐大。
開發中的應用場景
StringBuilder類的append方法
SQL中的preparedSataement
JDOM中的DomBuilder,SAXBuilder
(以Builder結尾的類大多都應用了構建者模式)
以上爲建造者模式的學習筆記,此文章爲尚學堂視頻的學習筆記+自己總結。參考資料:Head First 設計模式。