在學習MyBatis的過程當中遇到了建造者(Builder)模式,查找了相關資料,在這作下記錄加深印象。html
參考資料:java
將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示,通俗的說就是:建造者模式就是如何一步步構建一個包含多個組成部件的對象,相同的構建過程能夠建立不一樣的產品。設計模式
小明想組裝一個臺式電腦,小明對電腦配置一竅不通,就直接跑到電腦城給裝機老闆說我要一臺打遊戲很是爽的電腦,麻煩你給裝一下「配置什麼的你給我推薦一下吧」,因而老闆就讓它的員工「小美」按小明的要求裝了一個性能灰常牛 B 的電腦,1 個小時後電腦裝好了,小明交錢拿電腦走人。不一下子小張又來了,要一個知足平時寫文章就能夠的電腦,老闆針對小張的要求給不一樣的裝機配置。不一樣的人有不一樣的配置方案「可是裝機流程是同樣的」,這就是一個典型的建造者模式。ide
1 package club.nipengfei.demo02; 2 3 /** 4 * 產品類--被建造的對象 5 */ 6 public class Computer { 7 private String cpu ; // cpu 8 private String hardDisk ; //硬盤 9 private String mainBoard ; // 主板 10 private String memory ; // 內存 11 12 public String getCpu() { 13 return cpu; 14 } 15 16 public void setCpu(String cpu) { 17 this.cpu = cpu; 18 } 19 20 public String getHardDisk() { 21 return hardDisk; 22 } 23 24 public void setHardDisk(String hardDisk) { 25 this.hardDisk = hardDisk; 26 } 27 28 public String getMainBoard() { 29 return mainBoard; 30 } 31 32 public void setMainBoard(String mainBoard) { 33 this.mainBoard = mainBoard; 34 } 35 36 public String getMemory() { 37 return memory; 38 } 39 40 public void setMemory(String memory) { 41 this.memory = memory; 42 } 43 }
1 package club.nipengfei.demo02; 2 3 /** 4 * 抽象的建造者,即裝電腦的步驟 5 * 至於安裝什麼型號的主板,不是我關心,而是具體的建造者關心的 6 */ 7 public interface Builder { 8 // 安裝主板 9 void createMainBoard(String mainBoard) ; 10 // 安裝 cpu 11 void createCpu(String cpu) ; 12 // 安裝硬盤 13 void createhardDisk(String hardDisk) ; 14 // 安裝內存 15 void createMemory(String memory) ; 16 // 組成電腦 17 Computer createComputer() ; 18 }
1 package club.nipengfei.demo02; 2 3 public class AssemblerBuilder implements Builder { 4 Computer computer = new Computer(); 5 @Override 6 public void createMainBoard(String mainBoard) { 7 computer.setMainBoard(mainBoard); 8 } 9 10 @Override 11 public void createCpu(String cpu) { 12 computer.setCpu(cpu); 13 } 14 15 @Override 16 public void createhardDisk(String hardDisk) { 17 computer.setHardDisk(hardDisk); 18 } 19 20 @Override 21 public void createMemory(String memory) { 22 computer.setMemory(memory); 23 } 24 25 @Override 26 public Computer createComputer() { 27 return computer; 28 } 29 }
package club.nipengfei.demo02; /** * 聲明一個導演類「指揮者,這裏能夠裝電腦的老闆」,用來指揮組裝過程,也就是組裝電腦的流程 */ public class Director { private Builder builder; // 使用多態,裝機工不少,老闆能夠指揮各個裝幾個 public Director(Builder builder){ this.builder = builder; } // 老闆最後只想得到裝成的成品 public Computer createComputer(String cpu,String hardDisk,String mainBoard,String memory){ // 具體工做是裝機工去作 this.builder.createMainBoard(mainBoard); this.builder.createCpu(cpu); this.builder.createMemory(memory); this.builder.createhardDisk(hardDisk); return this.builder.createComputer(); } }
1 package club.nipengfei.demo02; 2 3 public class Test { 4 public static void main(String[] args) { 5 // 裝機員小美 6 Builder builder = new AssemblerBuilder(); 7 // 老闆把小明的需求轉給小美 8 Director director = new Director(builder); 9 // 老闆最後拿到成品電腦,工做小美去作 10 Computer computer = director.createComputer("Intel 酷睿i9 7900X","三星M9T 2TB (HN-M201RAD)","技嘉AORUS Z270X-Gaming 7","科賦Cras II 紅燈 16GB DDR4 3000"); 11 System.out.println("小明使用的電腦是:\n"+computer.getMainBoard()+"主板\n"+computer.getCpu()+"CPU\n"+computer.getHardDisk()+"硬盤\n"+computer.getMemory()+"內存\n"); 12 } 13 }
1 小明使用的電腦是: 2 技嘉AORUS Z270X-Gaming 7主板 3 Intel 酷睿i9 7900XCPU 4 三星M9T 2TB (HN-M201RAD)硬盤 5 科賦Cras II 紅燈 16GB DDR4 3000內存
建造者模式是一種建立型模式,適用於那些流程固定「順序不必定固定」,建造的目標對象會有所改變這種場景「好比畫一條狗,這個目標不變,可是不一樣的是有黃狗,胖狗,瘦狗等」。上面的示例中安裝電腦的流程是固定的,建造的目標對象會改變,Computer.java的對象不一樣,能夠有不一樣的主板,CPU,硬盤,內存。post