建造者模式

作者:某人_Valar
如需轉(zhuǎn)載請(qǐng)保留原文鏈接;

設(shè)計(jì)模式的3大類:

  • 創(chuàng)建型模式(5種)建造者模式,單例模式,工廠方法模式,抽象工廠模式,原型模式。
  • 結(jié)構(gòu)性模式(7種)適配器模式,裝飾模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。
  • 行為型模式(11種)策略模式,模板方法模式,觀察者模式,迭代器模式,責(zé)任鏈模式,命令模式,備忘錄模式,狀態(tài)模式,訪問者模式,中介者模式,解釋器模式。

1. 什么是建造者模式

建造者模式是一個(gè)創(chuàng)建復(fù)雜對(duì)象的創(chuàng)建型模式,其將構(gòu)建復(fù)雜對(duì)象的過程和它的部件解耦,使得構(gòu)建過程和部件的表示分離開來。

例如我們要DIY一臺(tái)臺(tái)式機(jī)。我們找到DIY商家。這時(shí)我們可以要求這個(gè)臺(tái)式機(jī)的CPU,顯卡或者其他部件是什么牌子的,什么配置的,這些部件可以根據(jù)我們自己的需求來變化。但是這些部件組裝成計(jì)算機(jī)的過程是一樣的,我們無需知道這些部件是怎么組裝成計(jì)算機(jī)的,我們只需要提供相關(guān)部件的牌子和配置就可以了。

對(duì)于這種情況,我們就可以使用建造者模式,將部件與組裝過程分離,使得構(gòu)建過程和部件都可以自由擴(kuò)展,兩者之間的耦合度也降到最低。

2. 建造者模式的實(shí)現(xiàn)

在建造者模式中一般有下面一個(gè)角色:

  • Product:產(chǎn)品類。
  • Builder:抽象Buidler類,規(guī)范產(chǎn)品的組建,一般由子類實(shí)現(xiàn)。
  • ConcreteBuilder:具體建造者,實(shí)現(xiàn)抽象Builder類定義的所有方法,并返回一個(gè)組建好的對(duì)象。
  • Director:導(dǎo)演類,負(fù)責(zé)已有模塊的排序,然后通知Builder開始建造。
  1. 創(chuàng)建產(chǎn)品類
    要組裝一臺(tái)計(jì)算機(jī),計(jì)算機(jī)被抽象為Computer類,,他有2個(gè)部件:CPU、主板,并在里面提供了兩個(gè)方法用來設(shè)置CPU和主板。
public class Computer{
    private String mCpu;
    private String mMainboard;
    public void setmCpu(String mCpu){
        this.mCpu = mCpu;
    }
    public void setmMainboard(String mMainboard){
        this.mMainboard = mMainboard;
    }
}
  1. 創(chuàng)建Builder類規(guī)范產(chǎn)品的組建
    商家組裝計(jì)算機(jī)有一套組裝方法的模板,就是一個(gè)抽象的Builder類,其里面提供了安裝CPU,主板的方法,以及組裝成計(jì)算機(jī)的create方法,如下:
public abstract class Builder{
    public abstract void buildCpu(String cpu);
    public abstract void buildMainboard(String mainboard);
    public abstract Computer create();
}

商家實(shí)現(xiàn)了抽象的Builder類,

public class ComputerBuilder 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 Computer create(){
        return mComputer;    
    }
}
  1. 用導(dǎo)演類來統(tǒng)一組裝過程
    商家的導(dǎo)演類用來規(guī)范組裝的流程,先裝主板,再是CPU,最后組裝成計(jì)算機(jī):
public class Director{
    Builder mBuild = null;
    public Director(Builder build){
        this.mBuild = build;
    }
    public Computer createComputer(String cpu, String mainboard){
        //規(guī)范建造流程
        this.mBuild.buildMainboard(mainboard);
        this.mBuild.buildCpu(cpu);
        return mBuild.create();        
    }
}
  1. 客戶端調(diào)用導(dǎo)演類
    商家用導(dǎo)演類組裝計(jì)算機(jī),我們只需要提供想要的CPU,主板就可以了,至于商家是如何組裝的,我們無需知道。
public class CreateComputer{
    public static void main(String[] args){
        Builder mBuilder = new ComputerBuilder();
        Director mDirector = new Director(mBuilder);
        //組裝計(jì)算機(jī)
        mDirector.createComputer("i7-7700k","華碩B350-F主板");
    }
}

3. 使用建造者模式的場(chǎng)景以及優(yōu)缺點(diǎn)

建造者模式主要解決在軟件系統(tǒng)中,有時(shí)候面臨著"一個(gè)復(fù)雜對(duì)象"的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對(duì)穩(wěn)定。

建造者模式的使用場(chǎng)景:
(1)當(dāng)產(chǎn)品有復(fù)雜的內(nèi)部構(gòu)造時(shí)(參數(shù)很多)。
(2)需要生產(chǎn)的產(chǎn)品的屬性相互依賴,這些屬性的賦值順序比較重要時(shí)。

優(yōu)點(diǎn):
建造者類邏輯獨(dú)立,易拓展。
缺點(diǎn):
相對(duì)于普通寫法產(chǎn)生了多余的Build對(duì)象以及Director對(duì)象,消耗了內(nèi)存。

最后編輯于
?著作權(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)容

  • 1.建造者模式簡(jiǎn)介 定義 建造者模式(builder),將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以...
    人生苦短啊閱讀 473評(píng)論 0 1
  • 一、建造者模式簡(jiǎn)介 1.定義建造者模式(builder),將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可...
    Arnold_J閱讀 349評(píng)論 0 0
  • 1.建造者模式簡(jiǎn)介 定義 建造者模式(builder),將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以...
    劉望舒閱讀 808評(píng)論 0 11
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是建造者模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 Builder模式變種 建造者模式...
    w1992wishes閱讀 501評(píng)論 0 3
  • | 感恩| 回家,去了發(fā)小家,曾經(jīng)一起上學(xué)在一個(gè)年紀(jì)一個(gè)班!她年齡會(huì)比我小一歲...
    sherry月月閱讀 242評(píng)論 0 0

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