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();
		}
	}
	
}

運行結果:

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

Tags: