今天我們來說說設計模式中的建造者模式。
日常開發中我們見過的建造者模式應該還不算少,平常用的Dialog和一些第三方框架,挺多一部分正是用了建造者模式。
建造者模式是創建一個複雜對象的創建型模式,有人也稱它爲生成器模式,它將其構建複雜對象的過程和它
的組件解耦,使得構建過程和組件分離開來。比如我們自己DIY一部手機,我們可以根據自己的喜好去選擇
它的CPU,是麒麟的還是驍龍的,還有它的屏幕, 是要索尼的還是三星的,或是其他組件的其他要求,這些
組件是我們根據自己的喜好選擇的,但是這些組件組裝成一部手機的過程是一樣的,我們無須知道這些部件是
怎麼樣組裝成手機的,我們只需要提供相應的組件和配置就可以了。對於這種情況下,我們就比較適合用建造
者模式了,將組件和組件的組裝過程分離,使得組件和組裝過程都可以自由擴展。
還是一樣,我們先來看看它的定義:
將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
建造者模式中有如下角色:
Director:導向器,引向器,負責安排已有模塊的順序,然後通知Builder開始建造。
Builder:抽象Builder類,規範產品的組建,一般由子類實現。
ConcreteBuilder:具體建造者,實現抽象Builder類中定義的所有方法,並且返回一個組建好的對象。
Product:產品類。
下面我們用一個例子簡單實現下建造者模式。
首先我們創建產品類,新建一個Phone類,假設它有三個零件組成:CPU,屏幕、電池。並提供3個方法
用來設置CPU、屏幕、電池。
public class Phone{
private String mCpu;
private String mScreen;
private String mBattery;
public void setmCpu(String mCpu){
this.mCpu = mCpu;
}
public void setmScreen(String mScreen){
this.mScreen = mScreen;
}
public void setmBattery(String mBattery){
this.mBattery = mBattery;
}
}
接下來我們需要Builder抽象類,用來規範產品的組件,一部完整的手機需要一個CPU、屏幕、電池。
其裏面提供了安裝CPU、屏幕、電池的方法,以及組裝成計算機的create方法。
public abstract class Builder{
public abstract void buildCpu(String cpu);
public abstract void buildScreen(String screen);
public abstract void buildBattery(String battery);
public abstract Phone create();
}
接着我們實現具體的建造者,SuperPhoneBuilder用於組裝超級手機。
public class SuperPhoneBuilder extends Builder{
private Phone mPhone = new Phone();
@Override
public void buildCpu(String cpu) {
mPhone.setmCpu(cpu);
}
@Override
public void buildScreen(String screen) {
mPhone.setmScreen(screen);
}
@Override
public void buildBattery(String battery) {
mPhone.setmBattery(battery);
}
@Override
public Phone create() {
return mPhone;
}
}
最後我們需要導向器來規範組裝手機的流程規範,先安裝CPU,然後裝屏幕,最後裝電池。
public class Direcror{
Builder mBuild = null;
public Direcror(Builder build){
this.mBuild = build;
}
public Phone createPhone(String cpu,String srceen,String battery){
this.mBuild.buildCpu(cpu);
this.mBuild.buildScreen(srceen);
this.mBuild.buildBattery(battery);
this.mBuild.create();
}
}
到這裏,我們的組建手機的過程已經定義完成了,接下來我們看看最後我們怎麼去組裝這部手機,我們只需要
提供自己想要的CPU型號,屏幕廠商,和電池容量就可以了,至於它是怎麼組建的我們無須知道。看看代碼
public class CreatePhone{
public static void main(String[] args){
Builder builder = new SuperPhoneBuilder();
Direcror direcror = new Direcror(builder);
Phone phone = direcror.createPhone("麒麟810","Sony 4K","10000mAh");
}
}
現在,我們完整的建造手機的例子已經完成。
接下來整理一下建造者模式的使用場景和優缺點。
使用場景:
1:當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2:相同的方法,不同的執行順序,產生不同的事件結果時。
3:多個部件或零件都可以被裝配到一個對象中,但是產生的運行結果又不相同時。
4:產品類非常複雜,或者產品類中的調用順序不同而產生了不同的效能。
5:在創建一下複雜的對象時,這些對象的內部組成構件間的建造順序是穩定的,但是對象的內部組成構件
面臨着複雜的變化。
優點:
1:使用建造者模式可以使客戶端段不必知道產品內部組成的細節。
2:具體的建造者之間是相互獨立的,容易擴展。
3:由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產生任何影響。
缺點:
產生多餘的Build對象以及導向器。
再累再苦,只當自己是二百五,再艱再險,只當自己是二皮臉。與君共勉~