建造者模式
建造者模式介紹
將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示擎勘。
建造者模式分析
1.引入抽象建造者的目的顶考,是為了將建造的具體過程交與它的子類來實(shí)現(xiàn)。這樣更容易擴(kuò)展瓢湃。一般至少會有兩個(gè)抽象方法伟众,一個(gè)用來建造產(chǎn)品析藕,一個(gè)是用來返回產(chǎn)品。
2.具體的建造者用來實(shí)現(xiàn)抽象建造的方法,包括:組建產(chǎn)品账胧,返回組建好的產(chǎn)品
3.指揮類:負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅斫M建產(chǎn)品竞慢,指揮類不與具體的產(chǎn)品發(fā)生依賴關(guān)系。
建造者模式的使用場景
1.創(chuàng)建復(fù)雜對象的算法獨(dú)立于組成對象的部件
2.同一個(gè)創(chuàng)建過程需要有不同的內(nèi)部表象的產(chǎn)品對象
建造者模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1.客戶端不用關(guān)注生產(chǎn)細(xì)節(jié)
2.每個(gè)建造者都是獨(dú)立的治泥,用戶使用不同的具體建造者可得到不同的產(chǎn)品對象
3.可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程筹煮。
4.增加新的具體建造者無需修改原有代碼
缺點(diǎn)
1.當(dāng)建造者過多,會產(chǎn)生很多類
2.產(chǎn)品之間若共同點(diǎn)很少居夹,則不適宜該模式败潦。
3.若產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定義很多具體建造者類來實(shí)現(xiàn)這種變化
建造者模式示例代碼
Builder相關(guān)類
Builder.java
public abstract class Builder {
public abstract Builder buildBoard(String board);
public abstract Builder buildDisplay(String display);
public abstract Builder buildOs();
public abstract Computer build();
}
MacBookBuilder.java
public class MacBookBuilder extends Builder {
private Computer computer = new MacBook();
@Override
public Builder buildBoard(String board) {
computer.setBoard(board);
return this;
}
@Override
public Builder buildDisplay(String display) {
computer.setDisplay(display);
return this;
}
@Override
public Builder buildOs() {
computer.setOs();
return this;
}
@Override
public Computer build() {
return computer;
}
}
MiBuilder.java
public class MiBuilder extends Builder {
private Computer computer = new MiBook();
@Override
public Builder buildBoard(String board) {
computer.setBoard(board);
return this;
}
@Override
public Builder buildDisplay(String display) {
computer.setDisplay(display);
return this;
}
@Override
public Builder buildOs() {
computer.setOs();
return this;
}
@Override
public Computer build() {
return computer;
}
}
實(shí)體相關(guān)類
Computer.java
public abstract class Computer {
protected String mBoard;
protected String mDisplay;
protected String mOs;
protected Computer() {
}
public void setBoard(String board) {
mBoard = board;
}
public void setDisplay(String display) {
this.mDisplay = display;
}
public abstract void setOs();
@Override
public String toString() {
return "Computer{" +
"mBoard='" + mBoard + '\'' +
", mDisplay='" + mDisplay + '\'' +
", mOs='" + mOs + '\'' +
'}';
}
}
MacBook.java
public class MacBook extends Computer {
@Override
public void setOs() {
mOs = "Mac OS X 12";
}
}
MiBook.java
public class MiBook extends Computer{
@Override
public void setOs() {
mOs = "Windows 10";
}
}
BuilderApplication.java
public class BuilderApplication {
public static void main(String[] args) {
Builder macBuilder = new MacBookBuilder();
Builder miBuilder = new MiBuilder();
Director dir = new Director();
dir.construct(miBuilder, "Intel", "IPS顯示器");
dir.construct(macBuilder, "Intel", "Retina顯示器");
Computer miComputer = miBuilder.build();
Computer macComputer = macBuilder.build();
System.out.println(miComputer);
System.out.println(macComputer);
}
}
運(yùn)行結(jié)果
Computer{mBoard='Intel', mDisplay='IPS顯示器', mOs='Windows 10'}
Computer{mBoard='Intel', mDisplay='Retina顯示器', mOs='Mac OS X 12'}