設計模式(三)建造者模式
阿新 • • 發佈:2019-02-11
1.建造者模式簡介
定義
建造者模式(builder),將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
簡介
建造者模式(builder)是建立一個複雜物件的建立型模式,將構建複雜物件的過程和它的部件解耦,使得構建過程和部件的表示分離開來。
例如我們要DIY一個桌上型電腦電腦,我們找到DIY商家,我們可以要求這臺電腦的cpu或者主機板或者其他的部件都是什麼牌子的什麼配置的,這些部件是我們可以根據我們的需求來變化的,但是這些部件組裝成電腦的過程是一樣的,我們不需要知道這些部件是怎樣組裝成電腦的,我們只需要提供部件的牌子和配置就可以了。對於這種情況我們就可以採用建造者模式,將部件和組裝過程分離,使得構建過程和部件都可以自由拓展,兩者之間的耦合也降到最低。
建造者模式結構圖
- Dirextor: 指揮者類,用於統一組裝流程
- Builder:抽象Builder類,規範產品的組建,一般是由子類實現。
- ConcreteBulider: 抽象Builder類的實現類,實現抽象Builder類定義的所有方法,並且返回一個組建好的物件
- Product: 產品類
2.建造者模式簡單實現
這裡我們就用DIY組裝電腦的例子來實現一下建造者模式。
建立產品類
我要組裝一臺電腦,電腦被抽象為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;
}
}
建立Builder類規範產品的組建
商家組裝電腦有一套組裝方法的模版,就是一個抽象的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指揮者類來統一組裝過程
商家的指揮者類用來規範組裝電腦的流程規範,先安裝主機板,再安裝CPU,最後安裝記憶體並組裝成電腦:
public class Direcror {
Builder mBuild=null;
public Direcror(Builder build){
this.mBuild=build;
}
public Computer CreateComputer(String cpu,String mainboard,String ram){
//規範建造流程
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.使用建造者模式的場景和優缺點
使用場景
- 當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。
- 相同的方法,不同的執行順序,產生不同的事件結果時。
- 多個部件或零件,都可以裝配到一個物件中,但是產生的執行結果又不相同時。
- 產品類非常複雜,或者產品類中的呼叫順序不同產生了不同的效能。
- 建立一些複雜的物件時,這些物件的內部組成構件間的建造順序是穩定的,但是物件的內部組成構件面臨著複雜的變化。
優缺點
優點:
- 使用建造者模式可以使客戶端不必知道產品內部組成的細節。
- 具體的建造者類之間是相互獨立的,容易擴充套件。
- 由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模組產生任何影響。
缺點:
- 產生多餘的Build物件以及Dirextor類。