建造者模式(Builder Pattern)

一、建造者模式簡介

1. 定義

建造者模式(Builder Pattern)將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示,和單例模式以及工廠模式一樣,建造者模式也屬于創(chuàng)建型設(shè)計模式。建造者模式使用多個簡單的對象一步一步創(chuàng)建一個復(fù)雜的對象,它允許用戶只通過指定復(fù)雜對象的類型和內(nèi)容就可以構(gòu)建它們,用戶不需要知道內(nèi)部的具體構(gòu)建細(xì)節(jié)。

2. 優(yōu)點

  • 易于解耦,將產(chǎn)品本身與產(chǎn)品創(chuàng)建過程進(jìn)行解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象;
  • 易于精確控制對象的創(chuàng)建,將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰;
  • 易于擴(kuò)展,針對新的需求實現(xiàn)一個新的建造者類即可,無需修改已經(jīng)測試通過的代碼。

3. 缺點

建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似,如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式。

二、建造者模式實現(xiàn)

1. 實現(xiàn)關(guān)鍵

  • 創(chuàng)建一個靜態(tài)內(nèi)部類Builder,并把所有外部類的參數(shù)復(fù)制到該類中;
  • 靜態(tài)內(nèi)部類Builder要具有一個public類型的構(gòu)造函數(shù),該構(gòu)造函數(shù)以必要的屬性值為參數(shù);
  • 靜態(tài)內(nèi)部類Builder類具有賦值可選參數(shù)的方法,并且方法的返回值是該類本身;
  • 靜態(tài)內(nèi)部類Builder類須提供一個類似于build()的方法,返回一個外部類實例;
  • 外部類需要一個以Builder的實例對象為參數(shù)的私有構(gòu)造函數(shù),完成給外部類的屬性變量賦值。

2. 具體實現(xiàn)

以組裝一臺電腦為例,需要的主要部件有中央處理器CPU,內(nèi)存,硬盤,鼠標(biāo),鍵盤等等,就不一一列出了。在組裝的時候,可以按照用戶的配置需求來組裝成其想要的電腦。

public class Computer {

    private String CPU;
    private String Memory;
    private String HardDisk;
    private String Mouse;
    private String KeyBoard;

    /**
     * 私有構(gòu)造函數(shù)
     * @param builder Builder的實例對象
     */
    private Computer(Builder builder) {
        this.CPU = builder.CPU;
        this.Memory = builder.Memory;
        this.HardDisk = builder.HardDisk;
        this.Mouse = builder.Mouse;
        this.KeyBoard = builder.KeyBoard;
    }

    public String toString() {
        return "CPU = " + CPU + ", Memory = " + Memory
                + ", HardDisk = " + HardDisk + ", Mouse = " + Mouse + ", KeyBoard = " + KeyBoard;
    }

    /**
     * 靜態(tài)內(nèi)部類-建造者
     */
    public static class Builder {
        //復(fù)制外部類的參數(shù)
        private String CPU;
        private String Memory;
        private String HardDisk;
        private String Mouse;
        private String KeyBoard;

        /**
         * public類型的構(gòu)造函數(shù)
         */
        public Builder() {

        }

        public Builder setCPU(String cpu) {
            this.CPU = cpu;
            return this;
        }

        public Builder setMemory(String memory) {
            this.Memory = memory;
            return this;
        }

        public Builder setHardDisk(String hardDisk) {
            this.HardDisk = hardDisk;
            return this;
        }

        public Builder setMouse(String mouse) {
            this.Mouse = mouse;
            return this;
        }

        public Builder setKeyBoard(String keyBoard) {
            this.KeyBoard = keyBoard;
            return this;
        }

        /**
         * build()的方法,返回一個外部類實例
         * @return Computer
         */
        public Computer build() {
            return new Computer(this);
        }
    }
}

建造者模式的使用也非常簡單,獲得一臺按需配置的電腦大概可以像這樣調(diào)用:

private void buildComputer() {
        Computer computer = new Computer.Builder()
                .setCPU("Intel Core i7")
                .setMemory("16 GB")
                .setHardDisk("512 GB")
                .setMouse("Apple Mouse")
                .setKeyBoard("Mechanical Keyboard")
                .build();

        System.out.println(computer.toString());
    }

輸出結(jié)果:

I/System.out: CPU = Intel Core i7, Memory = 16 GB, HardDisk = 512 GB, Mouse = Apple Mouse, KeyBoard = Mechanical Keyboard
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容