設(shè)計(jì)模式:工廠+策略+門面模式的應(yīng)用

使用工廠+策略模式增加系統(tǒng)的可擴(kuò)展性

官方定義

工廠模式

定義一個(gè)創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類,工廠方式使得一個(gè)類的實(shí)例延遲到子類中

策略模式

定義一組算法,使每個(gè)算法封裝起來,使得他們之間可以項(xiàng)目交換

門面模式

要求一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個(gè)統(tǒng)一的對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用

舉個(gè)栗子

工廠類

public class RefundServiceFactory {

    private static Map<RefundTypeEnum, RefundBaseService> serviceMap = new HashMap<RefundTypeEnum, RefundBaseService>();

    public static void register() {
        serviceMap.put(RefundTypeEnum.COMMON_REFUND, (RefundBaseService) SpringUtil.getBeanByName("refundServiceCoreImpl"));
        serviceMap.put(RefundTypeEnum.UNION_REFUND, (RefundBaseService) SpringUtil.getBeanByName("refundUnionPayServiceCoreImpl"));
    }

    public static RefundBaseService getService(String type) {
        if (CheckUtils.isEmpty(serviceMap)) {
           //注冊(cè)工廠實(shí)例
            register();
        }
        RefundTypeEnum refundTypeEnum = RefundTypeEnum.COMMON_REFUND;
        try {
            refundTypeEnum = RefundTypeEnum.valueOf(type);
        } catch (Exception e) {
        }
        return serviceMap.get(refundTypeEnum);
    }

}

調(diào)用

//策略模式+工廠模式獲取具體實(shí)例
RefundBaseService refundBaseService = RefundServiceFactory.getService(refund.getRefundType());
//門面模式執(zhí)行方法
refundRequestBean = refundBaseService.checkOrder(refund);

優(yōu)點(diǎn)講解

擴(kuò)展性極強(qiáng),想想看,需要擴(kuò)展一個(gè)新的方法,是不是只需要增加一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)方法即可。
\color{red}{一個(gè)完美的系統(tǒng),新的需求是不需要變更原有類的}

應(yīng)用場(chǎng)景

  • 不同支付方式走不同的支付類
  • 不同狀態(tài)走不同的處理類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容