設計模式學習筆記三:工廠方法模式

上篇文章講到了簡單工廠模式(Factory method)

本人將按照上篇文章的場景繼續討論,若想了解請移至:http://blog.csdn.net/array7/article/details/38499739。

場景只是爲了引申出主題,不具有實際意義,請諒解業務邏輯不完整之處,以後可能會再進行潤色,咱只是不希望把一個模式說的沒有依據。

    隨着公司領導有方與同事努力奮鬥,公司的業績越來越好,不同的業務線有了新的變化,以滿足公司的長足發展。

        機票組細分爲了國內機票、海外機票;

        酒店組細分了國內酒店、海外酒店;

        門票組細分了景點門票、賽事門票;

        度假組細分了......


    這個時候我們發現,現有的系統需要在業務層面上繼續分離,在系統結構上也需要有所變動。也就是說我們要修改系統達到這樣一個目的,根據同一個產品的不同類型創建訂單,而訂單的創建則有是一個具體的工廠的創建。我們還是用原來的訂單控制中心,只不過把訂單創建延遲到子類中進行。


代碼如下:

1、訂單中心,現在變成了抽象類,將creteOrder方法移回來並變成抽象方法。

/* 
 * OrderProcessCenter.java 1.0 2014/08/11 
 *  
 * 聲明:歡迎轉載,請註明出處。 
 *  
 */  

package com.array7.facotry_method;
/**
 * 訂單中心,負責對所有類型的訂單進行控制
 * @author array7
 *
 */
public abstract class OrderProcessCenter {
	public Order orderFlow(String type) {
//		Order order = new SimpleOrderFactory().createOrder(type);
		Order order = this.createOrder(type);
		order.pay();
		order.notifyCustomer();
		order.finish();
		return order;
	}
	
	public abstract Order createOrder(String type);
}

2、具體的工廠繼承上面的訂單中心類,實現指定類型的訂單工廠:

package com.array7.facotry_method;

public class ChinaOrderProcessCenter extends OrderProcessCenter{

	@Override
	public Order createOrder(String type) {
		Order order = null;
		if ("air".equals(type)) {
			order = new ChinaAirOrder();
		} else if ("hotel".equals(type)) {
			order = new ChinaHotelOrder();
		} else if ("ticket".equals(type)) {
			order = new ChinaTicketOrder();
		} else if ("xxx".equals(type)) {
			// TODO: some thing
		} else if ("yyy".equals(type)) {
			// TODO: some thing
		} else if ("zzz".equals(type)) {
			// TODO: some thing
		} else if ("123".equals(type)) {
			// TODO: some thing
		}
		return order;
	}

}

package com.array7.facotry_method;

public class ForeignOrderProcessCenter extends OrderProcessCenter{

	@Override
	public Order createOrder(String type) {
		Order order = null;
		if ("air".equals(type)) {
			order = new ForeignAirOrder();
		} else if ("hotel".equals(type)) {
			order = new ForeignHotelOrder();
		} else if ("ticket".equals(type)) {
			order = new ForeignTicketOrder();
		} else if ("xxx".equals(type)) {
			// TODO: some thing
		} else if ("yyy".equals(type)) {
			// TODO: some thing
		} else if ("zzz".equals(type)) {
			// TODO: some thing
		} else if ("123".equals(type)) {
			// TODO: some thing
		}
		return order;
	}

}


3、創建具體的訂單:

package com.array7.facotry_method;

public class ChinaAirOrder extends Order{
	public ChinaAirOrder() {
		System.out.println("create a ChinaAirOrder...");
	}
}

package com.array7.facotry_method;

public class ChinaHotelOrder extends Order{
	public ChinaHotelOrder() {
		System.out.println("create a ChinaHotelOrder...");
	}
}

package com.array7.facotry_method;

public class ChinaTicketOrder extends Order{
	public ChinaTicketOrder() {
		System.out.println("create a ChinaTicketOrder...");
	}
}

package com.array7.facotry_method;

public class ForeignAirOrder extends Order {
	@Override
	public void pay() {  // 覆蓋了支付方式,使用visa以支持國際支付
		System.out.println("VISA paid...");
	}
}

package com.array7.facotry_method;

public class ForeignHotelOrder extends Order {
	public ForeignHotelOrder() {
		System.out.println("create a ForeignHotelOrder...");
	}
	
	@Override
	public void pay() {  // 覆蓋了支付方式,使用visa以支持國際支付
		System.out.println("Visa paid...");
	}
}

package com.array7.facotry_method;

public class ForeignTicketOrder extends Order {
	public ForeignTicketOrder() {
		System.out.println("create a ForeignTicketOrder...");
	}
}


4、OK,至此我們的訂單邏輯已經完成,下面下2張單測試一下:

package com.array7.facotry_method;

public class Test {
	public static void main(String[] args) {
		// 創建一個國內酒店訂單
		OrderProcessCenter chinaOrderCenter = new ChinaOrderProcessCenter();
		chinaOrderCenter.orderFlow("hotel");
		// 創建一個國外訂單
		OrderProcessCenter foreignderCenter = new ForeignOrderProcessCenter();
		foreignderCenter.orderFlow("hotel");
	}
}

輸出:

create a ChinaHotelOrder...
paid...
done...
finished...
create a ForeignHotelOrder...
Visa paid...
done...
finished...

輸出正常,是我們想要的結果。從此碼農們可以專心搞一個模塊了。業務也清晰了。每個業務線都能獨立處理自己的邏輯。簡單工廠模式的時候,我們是無法選擇國內或者國外等類型的,而在訂單中心中我們可以選擇使用哪種工作生產產品。


文章僅供個人學習記錄,有不到之處還請指正。


後續會慢慢潤色力求精準全面。




發佈了44 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章