作者:某人_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開始建造。
- 創(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;
}
}
- 創(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;
}
}
- 用導(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();
}
}
- 客戶端調(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)存。