Java設(shè)計(jì)模式之建造者模式

前言

建造者模式也被稱為生成器模式,它是創(chuàng)建一個(gè)復(fù)雜對(duì)象的創(chuàng)建型模式,它將構(gòu)建復(fù)雜的對(duì)象過程和它的部件解耦,使構(gòu)建過程和部件的表示分離開來(lái)。例如我們自己要
DIY 一臺(tái)臺(tái)式計(jì)算機(jī)。我們找到 DIY 商家,這是我們要求這臺(tái)計(jì)算機(jī)的 CPU、主板、或者其他部件都是什么牌子、什么配置的,這些部件是可以根據(jù)我們自己的需求來(lái)變化的。我們只需要提供相關(guān)部件的牌子和配置就可以了。對(duì)于這種情況我們的可以采用建造者模式,將部件和組裝過程分離,使得構(gòu)建過程和部件都可以自由拓展,兩者之間的耦合也降到最低。

定義

將一個(gè)復(fù)雜的對(duì)象結(jié)構(gòu)與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

使用場(chǎng)景

  • 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
  • 相同的方法,不同的執(zhí)行順序,生產(chǎn)不同的事件結(jié)果時(shí)。
  • 多個(gè)部件或零件都可以被裝配到一個(gè)對(duì)象中,但是生產(chǎn)的運(yùn)行結(jié)果又不相同時(shí)。
  • 產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同而生產(chǎn)了不同的效能時(shí)。
  • 需要?jiǎng)?chuàng)建一些復(fù)雜對(duì)象,這些對(duì)象內(nèi)部組成構(gòu)件間的建造順序是穩(wěn)定的,但是對(duì)象的內(nèi)部組成構(gòu)件面臨復(fù)雜的變化時(shí)。

角色

  • Director:導(dǎo)演類,負(fù)責(zé)安排已有模塊的順序,然后通知 Builder 開始建造。
  • Builder:抽象 Builder類,規(guī)范產(chǎn)品的組建,一般由子類實(shí)現(xiàn)。
  • ConcreteBuilder:具體建造者,實(shí)現(xiàn)抽象 Builder 類定義的所有方法,并且返回一個(gè)組建好的對(duì)象。
  • Product:產(chǎn)品類。

建筑者模式的簡(jiǎn)單實(shí)現(xiàn)

  1. 創(chuàng)建產(chǎn)品類:我們要組裝一臺(tái)計(jì)算機(jī),計(jì)算機(jī)被抽象為 Computer 類,它有3個(gè)部件:CPU、主板和內(nèi)存,并在里面提供3個(gè)方法分別用來(lái)設(shè)置 CPU、主板和內(nèi)存。
public class Computer {
    private String mCpu;
    private String mMainboard;
    private String mRam;

    public void setmCpu(String mCpu) {
        this.mCpu = mCpu;
    }

    public void setmMainboard(String mMainboard) {
        this.mMainboard = mMainboard;
    }

    public void setmRam(String mRam) {
        this.mRam = mRam;
    }
}
  1. 創(chuàng)建Builder類規(guī)范產(chǎn)品的創(chuàng)建:商家組裝計(jì)算機(jī)有一套組裝方法的模版,就是一個(gè)抽象的 Builder 類,其里面提供了安裝 CPU、主板和內(nèi)存的方法,以及組裝成計(jì)算機(jī)的 creact 方法。
public abstract class Builder {
    public abstract void buildCpu(String cpu);
    public abstract void buildMainboard(String mainboard);
    public abstract void buildRam(String ram);
    public abstract Computer create();
}
  1. 創(chuàng)建組裝計(jì)算機(jī)類:商家實(shí)現(xiàn)了抽象的 Builder 類,MoonComputerBuilder 類用于組裝計(jì)算機(jī)。
public class MoonComputerBuilder extends Builder {
    private Computer mComputer = new Computer();
    @Override
    public void buildCpu(String cpu) {
        mComputer.setmCpu(cpu);
    }

    @Override
    public void buildMainboard(String mainboard) {
        mComputer.setmMainboard(mainboard);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setmRam(ram);
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}
  1. 創(chuàng)建導(dǎo)演類:統(tǒng)一管理組裝過程。商家就是導(dǎo)演類用來(lái)規(guī)范組裝計(jì)算機(jī)的流程規(guī)范,先安裝主板,在安裝 CPU ,最后安裝內(nèi)存并組裝完成計(jì)算機(jī):
public class Director {
    Builder mBuild = null;
    public Director(Builder build){
        this.mBuild = build;
    }
    public Computer CreateComputer(String cpu, String mainboard, String ram){
        //規(guī)范建筑流程
        this.mBuild.buildMainboard(mainboard);
        this.mBuild.buildCpu(cpu);
        this.mBuild.buildRam(ram);
        return mBuild.create();
    }
}
  1. 客戶端調(diào)用導(dǎo)演類:最后商家用導(dǎo)演類組裝計(jì)算機(jī)。我們只需要提供自己想要的 CPU 、主板和內(nèi)存就可以了,至于商家怎樣組裝計(jì)算機(jī)我們無(wú)須知道。
public class CreateComputer {
    public static void main(String[] args){
        Builder mBuilder = new MoonComputerBuilder();
        Director mDirector = new Director(mBuilder);
        //組裝計(jì)算機(jī)
        mDirector.CreateComputer("i7-6700", "華擎玩家至尊", "三星 DDR4");
    }
}

優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
  • 具體的建造者類之間是相互獨(dú)立的,容易擴(kuò)展。
  • 由于具體的建造者是獨(dú)立的,因此可以對(duì)建造過程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響。

缺點(diǎn)

  • 多出 Build 對(duì)象以及導(dǎo)演類。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 關(guān)于建造者模式(或者又叫構(gòu)造者模式),我在網(wǎng)上看了很多文章。其中不乏很多人直接把建造者模式等同于builder構(gòu)造...
    Mock2052閱讀 849評(píng)論 0 0
  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,888評(píng)論 0 14
  • 下面是本人學(xué)習(xí)之后的一些總結(jié) 以手機(jī)建造為例: 代碼均以圖片展示 測(cè)試代碼段
    AlgorithmIsSoul閱讀 370評(píng)論 2 1
  • 去頭條面試的一些題目,面試官很好,態(tài)度也很好。很想進(jìn),水平不夠。 .position absolute是相對(duì)于誰(shuí)定...
    想回到童年閱讀 560評(píng)論 8 1
  • 不要擔(dān)心,你要相信,你會(huì)過上你想要的生活。 我們可以拒絕很多東西,卻拒絕不了成長(zhǎng)。最令人失望的成長(zhǎng),是變不了你喜歡...
    小時(shí)公子閱讀 621評(píng)論 48 33

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