1.建造者模式簡介
定義
建造者模式(builder)艺晴,將一個復雜對象的構建與它的表示分離葬项,使得同樣的構建過程可以創(chuàng)建不同的表示陕赃。
簡介
建造者模式(builder)是創(chuàng)建一個復雜對象的創(chuàng)建型模式啥么,將構建復雜對象的過程和它的部件解耦阳懂,使得構建過程和部件的表示分離開來乾颁。
例如我們要DIY一個臺式機電腦蜜氨,我們找到DIY商家炎滞,我們可以要求這臺電腦的cpu或者主板或者其他的部件都是什么牌子的什么配置的,這些部件是我們可以根據我們的需求來變化的舵匾,但是這些部件組裝成電腦的過程是一樣的俊抵,我們不需要知道這些部件是怎樣組裝成電腦的,我們只需要提供部件的牌子和配置就可以了坐梯。對于這種情況我們就可以采用建造者模式徽诲,將部件和組裝過程分離,使得構建過程和部件都可以自由拓展吵血,兩者之間的耦合也降到最低馏段。
建造者模式結構圖
- Dirextor: 指揮者類,用于統(tǒng)一組裝流程
- Builder:抽象Builder類践瓷,規(guī)范產品的組建,一般是由子類實現亡蓉。
- ConcreteBulider: 抽象Builder類的實現類晕翠,實現抽象Builder類定義的所有方法,并且返回一個組建好的對象
- Product: 產品類
2.建造者模式簡單實現
這里我們就用DIY組裝電腦的例子來實現一下建造者模式砍濒。
創(chuàng)建產品類
我要組裝一臺電腦淋肾,電腦被抽象為Computer類,它有三個部件:CPU 爸邢、主板和內存樊卓。并在里面提供了三個方法分別用來設置CPU 、主板和內存:
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;
}
}
創(chuàng)建Builder類規(guī)范產品的組建
商家組裝電腦有一套組裝方法的模版杠河,就是一個抽象的Builder類,里面提供了安裝CPU碌尔、主板和內存的方法,以及組裝成電腦的create方法:
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();
}
商家實現了抽象的Builder類券敌,MoonComputerBuilder類用于組裝電腦:
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;
}
}
用Dirextor指揮者類來統(tǒng)一組裝過程
商家的指揮者類用來規(guī)范組裝電腦的流程規(guī)范唾戚,先安裝主板,再安裝CPU待诅,最后安裝內存并組裝成電腦:
public class Direcror {
Builder mBuild=null;
public Direcror(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();
}
}
客戶端調用指揮者類
最后商家用指揮者類組裝電腦叹坦。我們只需要提供我們想要的CPU,主板和內存就可以了卑雁,至于商家怎樣組裝的電腦我們無需知道募书。
public class CreatComputer {
public static void main(String[]args){
Builder mBuilder=new MoonComputerBuilder();
Direcror mDirecror=new Direcror(mBuilder);
//組裝電腦
mDirecror.CreateComputer("i7-6700","華擎玩家至尊","三星DDR4");
}
}
3.使用建造者模式的場景和優(yōu)缺點
使用場景
- 當創(chuàng)建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
- 相同的方法测蹲,不同的執(zhí)行順序莹捡,產生不同的事件結果時。
- 多個部件或零件,都可以裝配到一個對象中扣甲,但是產生的運行結果又不相同時道盏。
- 產品類非常復雜,或者產品類中的調用順序不同產生了不同的效能。
- 創(chuàng)建一些復雜的對象時荷逞,這些對象的內部組成構件間的建造順序是穩(wěn)定的媒咳,但是對象的內部組成構件面臨著復雜的變化。
優(yōu)缺點
優(yōu)點:
- 使用建造者模式可以使客戶端不必知道產品內部組成的細節(jié)种远。
- 具體的建造者類之間是相互獨立的涩澡,容易擴展。
- 由于具體的建造者是獨立的坠敷,因此可以對建造過程逐步細化妙同,而不對其他的模塊產生任何影響。
缺點:
- 產生多余的Build對象以及Dirextor類膝迎。