上篇文章講到了簡單工廠模式(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...
輸出正常,是我們想要的結果。從此碼農們可以專心搞一個模塊了。業務也清晰了。每個業務線都能獨立處理自己的邏輯。簡單工廠模式的時候,我們是無法選擇國內或者國外等類型的,而在訂單中心中我們可以選擇使用哪種工作生產產品。
文章僅供個人學習記錄,有不到之處還請指正。
後續會慢慢潤色力求精準全面。