建造者模式使用場(chǎng)景:
1.當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方法時(shí)。
2.相同的方法酗电,不同的執(zhí)行順序魄藕,產(chǎn)生不同的事件結(jié)果時(shí)。
3.多個(gè)部件或零件都可以被裝配到一個(gè)對(duì)象中撵术,但是產(chǎn)生的運(yùn)行結(jié)果又不相同的時(shí)候背率。
4.產(chǎn)品類非常復(fù)雜時(shí),或者產(chǎn)品類中的調(diào)用順序 不同面產(chǎn)生了不同的效能荷荤。
5.在創(chuàng)建一些復(fù)雜的對(duì)象時(shí)退渗,這些對(duì)象的內(nèi)部組成構(gòu)件間的建行順序 是穩(wěn)定的移稳,但對(duì)象的內(nèi)部組成構(gòu)件面臨著復(fù)雜的變化蕴纳。
優(yōu)點(diǎn):
1.使用建造者模式可以使用客戶端不必知道產(chǎn)品內(nèi)部的細(xì)節(jié)。
2.具體的建造者之間是相互獨(dú)立的个粱,容易擴(kuò)展古毛。
3.由于具體的建造者是獨(dú)立的,因此可以對(duì)建造者過程逐步細(xì)化,而不對(duì)其他的模塊產(chǎn)生任何影響稻薇。
缺點(diǎn):
產(chǎn)生多余的Build對(duì)象以及你導(dǎo)演類
創(chuàng)建產(chǎn)品類:
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)品的組建
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();
}
實(shí)現(xiàn)抽象類
public class MoonComputerBuilder extends Builder {
Computer computer = new Computer();
@Override
public void buildCpu(String cpu) {
computer.setmCpu(cpu);
}
@Override
public void buildMainboard(String mainboard) {
computer.setmMainboard(mainboard);
}
@Override
public void buildRam(String ram) {
computer.setmRam(ram);
}
@Override
public Computer create() {
return computer;
}
}
創(chuàng)建導(dǎo)演類 來規(guī)范整體流程
public class Direcror {
Builder builder = null;
public Direcror(Builder builder) {
this.builder = builder;
}
public Computer CreateComputer(String cpu,String mainboard,String mRam) {
builder.buildCpu(cpu);
builder.buildMainboard(mainboard);
builder.buildRam(mRam);
return builder.create();
}
}
具體使用
Builder builder = new MoonComputerBuilder();
Direcror direcror = new Direcror(builder);
direcror.CreateComputer("aaa","bbb","ccc");