定義: 定義: 將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 結構:(書中圖,侵刪) 一個產品類 一個指定產品各個部件的抽象創建介面 若幹個實現了各個部件的具體實現的創建類 一個指揮者,用於控制具體的創建過程,包含一個抽象創建介面的引用 實例: 實例: 書中使用了游戲中 ...
定義:
將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。結構:(書中圖,侵刪)
一個產品類 一個指定產品各個部件的抽象創建介面 若幹個實現了各個部件的具體實現的創建類 一個指揮者,用於控制具體的創建過程,包含一個抽象創建介面的引用實例:
書中使用了游戲中創建人物的例子,人都有頭、四肢、軀幹這些固定組成部分,但是高矮胖瘦各不相同。 我瞬間就想到了捏臉系統,雖然說捏臉系統把人物的各種細節都交給了用戶設置,細節到嘴唇的弧度都可以用戶調節。 但實際上創建過程還是固定不變的,用戶只需要將調整好的參數發送給系統,並不需要知道系統創建時是先“安”的頭,還是先“安”的腳。 出於儘量不和書中舉一樣的例子,充分活躍大腦,舉一反三的目的,我還得再想個別的例子。(其實還是沒有跳脫出去,說到底既然是建造者模式就是造東西,想了半天也都是在想能造個什麼其他的東西當例子。) 那就組裝個電腦吧。 台式機一般都有主機、顯示器、鍵盤、滑鼠。 電腦類(產品類):package designpattern.builder; public class Computer { public String computerCase; public String monitor; public String keyboard; public String mouse; public String getComputerCase() { return computerCase; } public void setComputerCase(String computerCase) { this.computerCase = computerCase; } public String getMonitor() { return monitor; } public void setMonitor(String monitor) { this.monitor = monitor; } public String getKeyboard() { return keyboard; } public void setKeyboard(String keyboard) { this.keyboard = keyboard; } public String getMouse() { return mouse; } public void setMouse(String mouse) { this.mouse = mouse; } @Override public String toString() { return "Computer [computerCase=" + computerCase + ", monitor=" + monitor + ", keyboard=" + keyboard + ", mouse=" + mouse + "]"; } }抽象建造者介面:
package designpattern.builder; public interface ComputerBuilder { void assembleComputerCase(Computer computer);// 組裝主機 void assembleMonitor(Computer computer);// 組裝顯示器 void assembleKeyboard(Computer computer);// 組裝鍵盤 void assembleMouse(Computer computer);// 組裝顯示器 }具體建造者類: 游戲型電腦建造者類:
package designpattern.builder; public class GameComputerBuilder implements ComputerBuilder { @Override public void assembleComputerCase(Computer computer) { computer.setComputerCase("水冷機箱"); } @Override public void assembleMonitor(Computer computer) { computer.setMonitor("4k顯示器"); } @Override public void assembleKeyboard(Computer computer) { computer.setKeyboard("機械鍵盤"); } @Override public void assembleMouse(Computer computer) { computer.setMouse("人體工學滑鼠"); } }娛樂型電腦建造者類:
package designpattern.builder; public class AmusementComputerBuilder implements ComputerBuilder { @Override public void assembleComputerCase(Computer computer) { computer.setComputerCase("普通機箱"); } @Override public void assembleMonitor(Computer computer) { computer.setMonitor("普通顯示器"); } @Override public void assembleKeyboard(Computer computer) { computer.setKeyboard("普通鍵盤"); } @Override public void assembleMouse(Computer computer) { computer.setMouse("普通滑鼠"); } }指揮者類:
package designpattern.builder; public class ComputerBuilderDirect { public void assembleComputer(ComputerBuilder computerBuilder, Computer computer) { computerBuilder.assembleComputerCase(computer); computerBuilder.assembleMonitor(computer); computerBuilder.assembleKeyboard(computer); computerBuilder.assembleMouse(computer); } // 或者寫成下麵這樣?可能具體情況具體分析吧 public Computer assembleComputer(ComputerBuilder computerBuilder) { Computer computer = new Computer(); computerBuilder.assembleComputerCase(computer); computerBuilder.assembleMonitor(computer); computerBuilder.assembleKeyboard(computer); computerBuilder.assembleMouse(computer); return computer; } }客戶端:
package designpattern.builder; public class Client { public static void main(String[] args) { ComputerBuilderDirect computerBuilderDirect = new ComputerBuilderDirect(); // 組裝游戲型電腦 Computer gameComputer = new Computer(); computerBuilderDirect.assembleComputer(new GameComputerBuilder(), gameComputer); System.out.println("游戲型電腦:"); System.out.println(gameComputer); // 組裝普通娛樂型電腦 Computer assembleComputer = new Computer(); computerBuilderDirect.assembleComputer(new AmusementComputerBuilder(), assembleComputer); System.out.println("普通娛樂型電腦:"); System.out.println(assembleComputer); } }結果輸出:
游戲型電腦: Computer [computerCase=水冷機箱, monitor=4k顯示器, keyboard=機械鍵盤, mouse=人體工學滑鼠] 普通娛樂型電腦: Computer [computerCase=普通機箱, monitor=普通顯示器, keyboard=普通鍵盤, mouse=普通滑鼠]