設計模式——抽象工廠實驗

Hygge-1024發表於2024-03-15

抽象工廠實驗

實驗場景:電子商務系統中建立的訂單分為國內訂單(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包執行成功截圖

相關文章