活在Android之Builder模式

我們首先來看一下Builder模式的定義:23種設計模式之一,英文叫Builder Pattern。其核心思想是將一個“復雜對象的構建算法”與它的“部件及組裝方式”分離,使得構件算法和組裝方式可以獨立應對變化;復用同樣的構建算法可以創建不同的表示,不同的構建過程可以復用相同的部件組裝方式。

Builder模式目的將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

我們應該在以下情況使用Build模式:

1 當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。

2 當構造過程必須允許被構造的對象有不同的表示時。

3 Builder模式要解決的也正是這樣的問題:

當我們要創建的對象很復雜的時候(通常是由很多其他的對象組合而成),

我們要復雜對象的創建過程和這個對象的表示(展示)分離開來,

這樣做的好處就是通過一步步的進行復雜對象的構建,

由于在每一步的構造過程中可以引入參數,使得經過相同的步驟創建最后得到的對象的展示不一樣。

沒有Builder模式的時候,是怎么樣寫代碼的?
舉個組裝電腦的例子來說明。有一臺電腦類,如下

public class Computer {
    private String cpu;
    private String motherboard;
    private String displayCard;
    private String ram;
    private String disk;
    private String power;
}

如果要組裝這樣一臺電腦,可以使用構造方法傳入參數列表,構建一個對象

public class Computer {
    private String cpu;
    private String motherboard;
    private String displayCard;
    private String ram;
    private String disk;
    private String power;
    
    public Computer(String cpu, String motherboard, String displayCard, String ram, String disk, String power) {
        this.cpu = cpu;
        this.motherboard = motherboard;
        this.displayCard = displayCard;
        this.ram = ram;
        this.disk = disk;
        this.power = power;
    }
}

但是參數列表的長度也太長了,看得都煩躁。而且,在使用構造 Computer 對象的時候,有可能暫時不需要傳入某些參數,比如目前只需要一個 CPU,那么就要重新寫一個構造方法,這樣也挺麻煩的。

public Computer(String cpu) {
    this.cpu = cpu;
}

Builder模式解決的問題
要實現電腦配件的定制化,這個時候,就可以使用 Builder 模式。

在 Computer 類中寫一個 Builder 類,配件的裝備工作交由 Builder 來完成。

public class Computer {
    private String cpu;
    private String motherboard;
    private String displayCard;
    private String ram;
    private String disk;
    private String power;

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public void setMotherboard(String motherboard) {
        this.motherboard = motherboard;
    }

    public void setDisplayCard(String displayCard) {
        this.displayCard = displayCard;
    }

    public void setRam(String ram) {
        this.ram = ram;
    }

    public void setDisk(String disk) {
        this.disk = disk;
    }

    public void setPower(String power) {
        this.power = power;
    }

    public static class Builder {
        private String cpu;
        private String motherboard;
        private String displayCard;
        private String ram;
        private String disk;
        private String power;
        
        public Builder setCpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder setMotherboard(String motherboard) {
            this.motherboard = motherboard;
            return this;
        }

        public Builder setDisplayCard(String displayCard) {
            this.displayCard = displayCard;
            return this;
        }

        public Builder setRam(String ram) {
            this.ram = ram;
            return this;
        }

        public Builder setDisk(String disk) {
            this.disk = disk;
            return this;
        }

        public Builder setPower(String power) {
            this.power = power;
            return this;
        }
        
        public Computer create() {
            Computer computer = new Computer();
            
            if (cpu != null) {
                computer.setCpu(cpu);
            }
            if (motherboard != null) {
                computer.setMotherboard(motherboard);
            }
            if (displayCard != null) {
                computer.setDisplayCard(displayCard);
            }
            if (ram != null) {
                computer.setRam(ram);
            }
            if (disk != null) {
                computer.setDisk(disk);
            }
            if (power != null) {
                computer.setPower(power);
            }
            
            return computer;
        }
    }
}

組裝電腦的代碼如下

Computer computer = new Computer.Builder()
    .setCpu("Intel Core i7")
    .setMotherboard("GIGABYTE Z97")
    .setDisplayCard("GTX Titan")
    .setRam("32G")
    .setDisk("2TB")
    .setPower("1000W")
    .create();

通過使用 Builder 模式,實現了對象的定制化構建,而且采用鏈式調用,方便了代碼編寫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 場景問題# 1.1 繼續導出數據的應用框架## 在討論工廠方法模式的時候,提到了一個導出數據的應用框架。 對于...
    七寸知架構閱讀 5,842評論 1 64
  • 沒有人買車會只買一個輪胎或者方向盤,大家買的都是一輛包含輪胎、方向盤和發動機等多個部件的完整汽車。如何將這些部件組...
    justCode_閱讀 1,869評論 1 6
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 面向對象的六大原則 單一職責原則 所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這個類就具有多于...
    JxMY閱讀 961評論 1 3
  • 晚風輕輕吹著, 紅日已顯示出它疲憊的身軀, 悄悄地躲進了大山的后面, 僅存的一絲霞光, 證明著它的存在, 直到退出...
    山隅閱讀 298評論 0 3