前言
建造者模式也被稱為生成器模式,它是創(chuàng)建一個(gè)復(fù)雜對(duì)象的創(chuàng)建型模式,它將構(gòu)建復(fù)雜的對(duì)象過程和它的部件解耦,使構(gòu)建過程和部件的表示分離開來(lái)。例如我們自己要
DIY 一臺(tái)臺(tái)式計(jì)算機(jī)。我們找到 DIY 商家,這是我們要求這臺(tái)計(jì)算機(jī)的CPU、主板、或者其他部件都是什么牌子、什么配置的,這些部件是可以根據(jù)我們自己的需求來(lái)變化的。我們只需要提供相關(guān)部件的牌子和配置就可以了。對(duì)于這種情況我們的可以采用建造者模式,將部件和組裝過程分離,使得構(gòu)建過程和部件都可以自由拓展,兩者之間的耦合也降到最低。
定義
將一個(gè)復(fù)雜的對(duì)象結(jié)構(gòu)與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
使用場(chǎng)景
- 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
- 相同的方法,不同的執(zhí)行順序,生產(chǎn)不同的事件結(jié)果時(shí)。
- 多個(gè)部件或零件都可以被裝配到一個(gè)對(duì)象中,但是生產(chǎn)的運(yùn)行結(jié)果又不相同時(shí)。
- 產(chǎn)品類非常復(fù)雜,或者產(chǎn)品類中的調(diào)用順序不同而生產(chǎn)了不同的效能時(shí)。
- 需要?jiǎng)?chuàng)建一些復(fù)雜對(duì)象,這些對(duì)象內(nèi)部組成構(gòu)件間的建造順序是穩(wěn)定的,但是對(duì)象的內(nèi)部組成構(gòu)件面臨復(fù)雜的變化時(shí)。
角色
-
Director:導(dǎo)演類,負(fù)責(zé)安排已有模塊的順序,然后通知
Builder開始建造。 -
Builder:抽象
Builder類,規(guī)范產(chǎn)品的組建,一般由子類實(shí)現(xiàn)。 -
ConcreteBuilder:具體建造者,實(shí)現(xiàn)抽象
Builder類定義的所有方法,并且返回一個(gè)組建好的對(duì)象。 - Product:產(chǎn)品類。
建筑者模式的簡(jiǎn)單實(shí)現(xiàn)
-
創(chuàng)建產(chǎn)品類:我們要組裝一臺(tái)計(jì)算機(jī),計(jì)算機(jī)被抽象為
Computer類,它有3個(gè)部件:CPU、主板和內(nèi)存,并在里面提供3個(gè)方法分別用來(lái)設(shè)置CPU、主板和內(nèi)存。
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ī)范產(chǎn)品的創(chuàng)建:商家組裝計(jì)算機(jī)有一套組裝方法的模版,就是一個(gè)抽象的
Builder類,其里面提供了安裝CPU、主板和內(nèi)存的方法,以及組裝成計(jì)算機(jī)的creact方法。
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();
}
-
創(chuàng)建組裝計(jì)算機(jī)類:商家實(shí)現(xiàn)了抽象的
Builder類,MoonComputerBuilder類用于組裝計(jì)算機(jī)。
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;
}
}
-
創(chuàng)建導(dǎo)演類:統(tǒng)一管理組裝過程。商家就是導(dǎo)演類用來(lái)規(guī)范組裝計(jì)算機(jī)的流程規(guī)范,先安裝主板,在安裝
CPU,最后安裝內(nèi)存并組裝完成計(jì)算機(jī):
public class Director {
Builder mBuild = null;
public Director(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();
}
}
-
客戶端調(diào)用導(dǎo)演類:最后商家用導(dǎo)演類組裝計(jì)算機(jī)。我們只需要提供自己想要的
CPU、主板和內(nèi)存就可以了,至于商家怎樣組裝計(jì)算機(jī)我們無(wú)須知道。
public class CreateComputer {
public static void main(String[] args){
Builder mBuilder = new MoonComputerBuilder();
Director mDirector = new Director(mBuilder);
//組裝計(jì)算機(jī)
mDirector.CreateComputer("i7-6700", "華擎玩家至尊", "三星 DDR4");
}
}
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。
- 具體的建造者類之間是相互獨(dú)立的,容易擴(kuò)展。
- 由于具體的建造者是獨(dú)立的,因此可以對(duì)建造過程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響。
缺點(diǎn)
- 多出
Build對(duì)象以及導(dǎo)演類。