建造者(Builder)模式

在學習MyBatis的過程當中遇到了建造者(Builder)模式,查找了相關資料,在這作下記錄加深印象。html

參考資料:java

  1. java設計模式-建造者模式(Builder)
  2. 人人都會設計模式---建造者模式--Builder
  3. 《JAVA與模式》之建造模式

1.什麼是建造者模式

將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示,通俗的說就是:建造者模式就是如何一步步構建一個包含多個組成部件的對象,相同的構建過程能夠建立不一樣的產品。設計模式

2.一個組裝電腦的示例

小明想組裝一個臺式電腦,小明對電腦配置一竅不通,就直接跑到電腦城給裝機老闆說我要一臺打遊戲很是爽的電腦,麻煩你給裝一下「配置什麼的你給我推薦一下吧」,因而老闆就讓它的員工「小美」按小明的要求裝了一個性能灰常牛 B 的電腦,1 個小時後電腦裝好了,小明交錢拿電腦走人。不一下子小張又來了,要一個知足平時寫文章就能夠的電腦,老闆針對小張的要求給不一樣的裝機配置。不一樣的人有不一樣的配置方案「可是裝機流程是同樣的」,這就是一個典型的建造者模式。ide

2.1建立被建造的電腦對象-----Computer.java

 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 }

2.2抽象的建造者-----Builder.java

 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 }

2.3具體建造者,也就是裝機工人小美 -----AssemblerBuilder.java

 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 }

2.4還有老闆安排裝機工工做

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();
    }
}

2.5測試類----Test.java

 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 }

2.6運行測試類結果

1 小明使用的電腦是:
2 技嘉AORUS Z270X-Gaming 7主板
3 Intel 酷睿i9 7900XCPU
4 三星M9T 2TB (HN-M201RAD)硬盤
5 科賦Cras II 紅燈 16GB DDR4 3000內存

3.建造者模式的特色

建造者模式是一種建立型模式,適用於那些流程固定「順序不必定固定」,建造的目標對象會有所改變這種場景「好比畫一條狗,這個目標不變,可是不一樣的是有黃狗,胖狗,瘦狗等」。上面的示例中安裝電腦的流程是固定的,建造的目標對象會改變,Computer.java的對象不一樣,能夠有不一樣的主板,CPU,硬盤,內存。post

4.建造者模式的做用

  1. 用戶不知道對象的建造過程和細節就能夠建立出複雜的對象「屏蔽了建造的具體細節」。在測試類中直接使用Director類的createComputer方法建立出computer對象。
  2. 用戶只需給出複雜對象的內容和類型能夠建立出對象。將參數給Director類對象。
  3. 建造者模式按流程一步步的建立出複雜對象。流程在Director.java中的createComputer方法,具體工做有裝機工完成。

5.建造者模式的優缺點

  • 優勢
    1. 使建立產品的步驟「把建立產品步驟放在不一樣的方法中(AssemblerBuilder.java中的各個方法),更加清晰直觀」和產品自己分離,即便用相同的建立過程建立出不一樣的產品。
    2. 每一個建造者都是獨立的互不影響,這樣就達到解耦的目的,因此若是想要替換現有的建造者那很是方便,添加一個實現便可。
  • 缺點
    1. 只適用於產品具備相同的特色「過程和步驟」,若是產品之間差別很是大,則不適用「使用範圍受限」
    2. 萬一那天產品內部發生改變,那多個建造者都要修改,成本太大

6.建造者模式的使用場景

  1. 若是一個對象有很是複雜的內部結構「這些產品一般有不少屬性」,那麼使用建造者模式
  2. 若是想把複雜對象的建立和使用分離開來,那麼使用建造者模式「使用相同的建立步驟能夠建立不一樣的產品」
相關文章
相關標籤/搜索