抽象工廠實驗
實驗場景:電子商務系統中建立的訂單分為國內訂單(Domestic Order)和海外訂單 (Overseas Order);國內訂單使用人民幣支付(RMB Payment),海外訂單使用 美元支付(USD Payment)。
實驗要求: 設計使用抽象工廠模式來實現訂單建立功能。
實驗內容:
- 將訂單工廠中的介面封裝為 order-api.jar 模組,得到訂單框架。
- 實現訂單框架中的介面,並將實現類封裝為 order-impl.jar 模組。
- 開發應用程式,使用訂單框架完成訂單建立功能。
- 換一種方法實現訂單框架中的介面,並將實現類封裝為 other-impl.jar 模組。
- 重新執行應用程式,將訂單框架的實現切換為 other-impl.jar 模組。
- 觀察對應用程式 的影響,並思考解決方案。 提示:使用 Java SPI(Service Provider Interface)或依賴注入框架
實驗理解:
抽象接:口有OrderFactory、Payment、Order。
OrderFactory介面需要被實現成國內國外兩種物件。因此在介面中只需要定義工廠要乾的事情,即建立自己的訂單(order)和支付(payment)。
Payment介面只需要定義 支付需要用到的方法,國內工廠外實現這些方法的時候僅需根據自身情況,來實現獨特的方法,這樣便輕鬆區分開了國內外支付的程式碼。
Order介面也只需要定義訂單相關的方法即可。
實現類:
DomesticOrderFactory實現了OrderFactory,它主要是建立國內的訂單和物件。
DomesticOrder實現Order,用來實現介面中的方法,應為具體實現是按照國內情況實現的,因此它就屬於國內的訂單。
RMBPayment實現Payment,用來實現介面中的方法,應為具體實現是按照國內情況實現的,因此它就屬於國內的支付。
國外類似。
實驗程式碼(放在一個專案中的情況,僅用來理解。實際需要打包成jar包來呼叫)
Order_api
order.java
package Order_api;
/**
* 這裡可以寫訂單相關的介面
* 寫的是國內外都能用到的介面,是一個並集
*/
public interface Order {
public void placeOrder();
}
OrderFactory.java
package Order_api;
public interface OrderFactory {
public Order createOrder();//建立訂單介面
public Payment createPayment();//建立支付介面
}
Payment.java
package Order_api;
/**
*這裡面就可以寫支付相關的方法(介面)
* 國內外都能用到的,是他們的並集
*/
public interface Payment {
public void pay(double money);
}
Order_impl
DomesticOrder.java
package Order_impl;
import Order_api.Order;
/**
* 用來實現國內訂單
* 實現具體的操作程式碼
* 因為國內外的訂單操作邏輯可能區別比較大,因此將其分開實現。
*/
public class DomesticOrder implements Order {
@Override
public void placeOrder() {
System.out.println("歡迎建立國內訂單!");
}
}
DomesticOrderFactory.java
package Order_impl;
import Order_api.Order;
import Order_api.OrderFactory;
import Order_api.Payment;
/**
* 國內工廠:它應該有兩個類,屬於國內的訂單,屬於國內的支付
*/
public class DomesticOrderFactory implements OrderFactory {
/**
* 用來建立國內工廠的訂單類
* @return DomesticOrder類(國內訂單類)
*/
@Override
public Order createOrder() {
return new DomesticOrder();
}
/**
* 建立國內工廠的支付類
* @return RMBPayment類
*/
@Override
public Payment createPayment() {
return new RMBPayment();
}
}
OverseasOrder.java
package Order_impl;
import Order_api.Order;
/**
* 用來實現國外訂單
* 實現具體的操作程式碼
* 因為國內外的訂單操作邏輯可能區別比較大,因此將其分開實現。
*/
public class OverseasOrder implements Order {
@Override
public void placeOrder() {
System.out.println("歡迎建立海外訂單!");
}
}
OverseasOrderFactory.java
package Order_impl;
import Order_api.Order;
import Order_api.OrderFactory;
import Order_api.Payment;
/**
* 國外工廠:它應該有兩個類,屬於國外的訂單,屬於國外的支付
*/
public class OverseasOrderFactory implements OrderFactory {
/**
* 用來建立國外工廠的訂單類
* @return OverseasOrder類(國內訂單類)
*/
@Override
public Order createOrder() {
return new OverseasOrder();
}
/**
* 建立國外工廠的支付類
* @return USDPayment類
*/
@Override
public Payment createPayment() {
return new USDPayment();
}
}
RMBPayment.java
package Order_impl;
import Order_api.Payment;
/**
* 這裡面來實現 屬於國內的介面。
* 國外可能有同樣的介面,但是他們實現的具體程式碼可能不同。
* 因此將國內國外的實現分離開來。
*/
public class RMBPayment implements Payment {
@Override
public void pay(double money) {
System.out.println("歡迎光臨:請您支付"+money+"人民幣");
}
}
USDPayment.java
package Order_impl;
import Order_api.Payment;
/**
* 這裡面來實現 屬於國外的介面。
* 國內可能有同樣的介面,但是他們實現的具體程式碼可能不同。
* 因此將國內國外的實現分離開來。
*/
public class USDPayment implements Payment {
@Override
public void pay(double money) {
System.out.println("歡迎光臨:請您支付"+money+"美元");
}
}
Application
應為演示是在一個專案中,所有包的位置並不嚴格準確
User_1.java
package Order_user;
import Order_api.Order;
import Order_api.OrderFactory;
import Order_api.Payment;
import Order_impl.DomesticOrderFactory;
import Order_impl.OverseasOrderFactory;
public class User_1 {
public static void main(String[] args) {
/**
* 國內工廠的執行例項
*/
OrderFactory Factory = new DomesticOrderFactory();
Order domesticOrder = Factory.createOrder();
Payment domestcPayment = Factory.createPayment();
domesticOrder.placeOrder();
domestcPayment.pay(14.39);
/**
* 國外工廠的執行例項
*/
Factory = new OverseasOrderFactory();
Order overseasOrder = Factory.createOrder();
Payment overseasPayment = Factory.createPayment();
overseasOrder.placeOrder();
overseasPayment.pay(2.00);
}
}
輸出結果為:
歡迎建立國內訂單!
歡迎光臨:請您支付14.39人民幣
歡迎建立海外訂單!
歡迎光臨:請您支付2.0美元
Java檔案打包成jar包
方法①
進入java檔案(帶.java)的目錄終端下面,執行以下指令:
javac Order.java
就可以將其編譯成.class
檔案
都編譯完後執行:
jar -cvf tools.jar *
將其打包成jar包
方法②
也可使用IDEA來打Jar包。
File -> Project Sructure -> Artifacts ->
From modules with dependencies... -> 。。。
透過匯入jar包執行成功截圖: