1. 程式人生 > 實用技巧 >Java設計模式三

Java設計模式三

建造者模式

當我們思考通過複雜的零件來生成一個完整的產品時,就用到了今天要說的主題-建造者模式,下面我們實際的程式碼來分析建造者模式的設計

假設飛機起飛需要有多個步驟,但是每種型號的飛機起飛的步驟又不相同,這時我們想要建造一個可以起飛多種型號飛機的工程。

1.首先我們先預先定義一個抽象的飛機起飛類,此類中包含啟動發動機、輪滑、推力式發射、彈射、起飛等操作。


public abstract class Airplane {
//定義每個步驟的執行順序
private ArrayList<String> sequence = new ArrayList<>();
//飛機開啟發動機
protected abstract void start();
//飛機滑行
protected abstract void glide();
//飛機被推力發射
protected abstract void emit();
//飛機彈射
protected abstract void popup();
//開始起飛
protected abstract void hopoff();
//設定傳遞方法
final public void setSequence(ArrayList<String> sequence) {
this.sequence = sequence;
}
//飛機起飛步驟
final public void run() {
for(int i = 0;i<this.sequence.size();i++) {
String actionName = this.sequence.get(i);
if(actionName.equalsIgnoreCase("start")) {
this.start();
}else if(actionName.equalsIgnoreCase("glide")) {
this.glide();
}else if(actionName.equalsIgnoreCase("emit")) {
this.emit();
}else if(actionName.equalsIgnoreCase("popup")) {
this.popup();
}else if(actionName.equalsIgnoreCase("hopoff")) {
this.hopoff();
}
}
} } class J10 extends Airplane{ @Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("J10啟動發動機");
} @Override
protected void glide() {
// TODO Auto-generated method stub
System.out.println("J10開始滑行"); } @Override
protected void emit() {
// TODO Auto-generated method stub
System.out.println("J10被髮射");
} @Override
protected void popup() {
// TODO Auto-generated method stub
System.out.println("J10被彈射");
} @Override
protected void hopoff() {
// TODO Auto-generated method stub
System.out.println("J10成功起飛");
} } class J15 extends Airplane{
@Override
protected void start() {
// TODO Auto-generated method stub
System.out.println("J15啟動發動機");
} @Override
protected void glide() {
// TODO Auto-generated method stub
System.out.println("J15開始滑行"); } @Override
protected void emit() {
// TODO Auto-generated method stub
System.out.println("J15被髮射");
} @Override
protected void popup() {
// TODO Auto-generated method stub
System.out.println("J15被彈射");
} @Override
protected void hopoff() {
// TODO Auto-generated method stub
System.out.println("J15成功起飛");
}
}

2.定義建造類-定義每種型別飛機的起飛步驟


/**
* 飛機組裝類
*
*/
public abstract class AirBuilder { public abstract void setSequence(ArrayList<String> sequence);
//設定飛機的不同型號
public abstract Airplane getAirplane();
} class J10Builder extends AirBuilder{
private J10 j10 = new J10(); @Override
public void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.j10.setSequence(sequence);
} @Override
public Airplane getAirplane() {
// TODO Auto-generated method stub
return this.j10;
} } class J15Builder extends AirBuilder{
private J15 j15 = new J15(); @Override
public void setSequence(ArrayList<String> sequence) {
// TODO Auto-generated method stub
this.j15.setSequence(sequence);
} @Override
public Airplane getAirplane() {
// TODO Auto-generated method stub
return this.j15;
} }

3.開始起飛測試


/**
* 飛行測試
*
*/
public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> sequence1 = new ArrayList<>();
sequence1.add("start");//設定J10開始發動
sequence1.add("glide");//開始滑行
sequence1.add("hopoff");//成功起飛
ArrayList<String> sequence2 = new ArrayList<>();
sequence2.add("start");//設定J150開始發動
sequence2.add("emit");//開始彈射
sequence2.add("hopoff");//成功起飛
//例項化一架J10
J10Builder j10builder = new J10Builder();
j10builder.setSequence(sequence1);
J10 j10 = (J10) j10builder.getAirplane();
j10.run();
System.out.println();
J15Builder j15Builder = new J15Builder();
j15Builder.setSequence(sequence2);
J15 j15 = (J15) j15Builder.getAirplane();
j15.run();
} }

執行結果:

批量建造

/**
* 飛機場-定義每種型號飛機的具體起飛方法
*/
public class AirPort {
private ArrayList<String> sequence = new ArrayList<>();//定義起飛步驟順序
private J10Builder j10builder = new J10Builder();
private J15Builder j15builder = new J15Builder();
/**
* 定義J10起飛步驟
* @return J10
*/
public J10 getJ10model() {
this.sequence.clear();
sequence.add("start");//設定J10開始發動
sequence.add("glide");//開始滑行
sequence.add("hopoff");//成功起飛 this.j10builder.setSequence(sequence);
return (J10)this.j10builder.getAirplane();
}
/**
* 定義J150起飛步驟
* @return J15
*/
public J15 getJ15model() {
this.sequence.clear();
sequence.add("start");//設定J15開始發動
sequence.add("emit");//彈射
sequence.add("hopoff");//成功起飛 this.j15builder.setSequence(sequence);
return (J15)this.j15builder.getAirplane();
} }

定義測試類


public class NewClient {
public static void main(String[] args) {
AirPort airport = new AirPort();
for (int i = 0; i<=20; i++) {
System.out.println("第"+i+"架J10開始起飛");
airport.getJ10model().run();
}
for (int i = 0; i<=30; i++) {
System.out.println("第"+i+"架J15開始起飛");
airport.getJ15model().run();
}
} }

執行結果:

以上程式碼可以細細品味這樣設計的好處,建造者模式便於我們控制細節,並且使得程式容易擴充套件。