相關文章
【設計模式】【一】設計六大原則
【設計模式】【二】單例模式的七種寫法
【設計模式】【三】建造者模式
【設計模式】【四】簡單工廠模式
【設計模式】【五】觀察者模式
【設計模式】【六】代理模式
【設計模式】【七】裝飾模式
【設計模式】【八】外觀模式
【設計模式】【九】模版方法模式
【設計模式】【十】工廠方法模式
【設計模式】【十一】策略模式
【設計模式】【十二】享元模式
【設計模式】【十三】抽象工廠模式
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類。