設(shè)計(jì)模式-抽象工廠模式

這一篇博文來介紹工廠模式中的第三種抽象工廠模式。

介紹

抽象工廠模式(Abstract Factory Pattern):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對象創(chuàng)建型模式。
抽象工廠模式不同于前面兩個(gè)模式,這篇也用支付的案例來講解。

現(xiàn)實(shí)中發(fā)生的支付情況可能是這樣:
支付都有個(gè)商戶號,然而現(xiàn)在有兩個(gè)商戶號,需要在不同時(shí)間段切換使用,例如上午使用A支付商戶號、下午使用B支付商戶號。


這里寫圖片描述

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

抽象工廠模式隔離了具體類的生成,使得客戶并不需要知道什么被創(chuàng)建。由于這種隔離,更換一個(gè)具體工廠就變得相對容易。所有的具體工廠都實(shí)現(xiàn)了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實(shí)例,就可以在某種程度上改變整個(gè)軟件系統(tǒng)的行為。另外,應(yīng)用抽象工廠模式可以實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計(jì)目的,因此抽象工廠模式得到了廣泛的應(yīng)用。
當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對象被設(shè)計(jì)成一起工作時(shí),它能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對象。這對一些需要根據(jù)當(dāng)前環(huán)境來決定其行為的軟件系統(tǒng)來說,是一種非常實(shí)用的設(shè)計(jì)模式。
增加新的具體工廠和產(chǎn)品族很方便,無須修改已有系統(tǒng),符合“開閉原則”。

缺點(diǎn)

在添加新的產(chǎn)品對象時(shí),難以擴(kuò)展抽象工廠來生產(chǎn)新種類的產(chǎn)品,這是因?yàn)樵诔橄蠊S角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,要支持新種類的產(chǎn)品就意味著要對該接口進(jìn)行擴(kuò)展,而這將涉及到對抽象工廠角色及其所有子類的修改,顯然會帶來較大的不便。
開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易,增加新的產(chǎn)品等級結(jié)構(gòu)麻煩)。

案例

早晨支付抽象類

public abstract class MorningPay {
    public abstract void morningOrderPay();
}

早晨支付寶支付類

public class MorningAliPay extends MorningPay {

    @Override
    public void morningOrderPay() {
        System.out.println("支付寶支付");
    }

}

早晨微信支付類

public class MorningWechatPay extends MorningPay {

    @Override
    public void morningOrderPay() {
        System.out.println("微信支付");
    }

}

下午的支付類同上,就不貼出來了


抽象工廠類

public abstract class PayFactory {
    public abstract MorningPay getMorningPay();
    
    public abstract AfternoonPay getAfternoonPay();
}

支付寶抽象工廠類

public class AliPayFactory extends PayFactory {

    @Override
    public MorningPay getMorningPay() {
        return new MorningAliPay();
    }

    @Override
    public AfternoonPay getAfternoonPay() {
        return new AfternoonAliPay();
    }

}

微信支付工廠類

public class WechatPayFactory extends PayFactory {

    @Override
    public MorningPay getMorningPay() {
        return new MorningWechatPay();
    }

    @Override
    public AfternoonPay getAfternoonPay() {
        return new AfternoonWechatPay();
    }

}

具體代碼見Github地址

總結(jié)

抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對象創(chuàng)建型模式。
抽象工廠模式包含四個(gè)角色:抽象工廠用于聲明生成抽象產(chǎn)品的方法;具體工廠實(shí)現(xiàn)了抽象工廠聲明的生成抽象產(chǎn)品的方法,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級結(jié)構(gòu)中;抽象產(chǎn)品為每種產(chǎn)品聲明接口,在抽象產(chǎn)品中定義了產(chǎn)品的抽象業(yè)務(wù)方法;具體產(chǎn)品定義具體工廠生產(chǎn)的具體產(chǎn)品對象,實(shí)現(xiàn)抽象產(chǎn)品接口中定義的業(yè)務(wù)方法。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對的是一個(gè)產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個(gè)產(chǎn)品等級結(jié)構(gòu)。
抽象工廠模式的主要優(yōu)點(diǎn)是隔離了具體類的生成,使得客戶并不需要知道什么被創(chuàng)建,而且每次可以通過具體工廠類創(chuàng)建一個(gè)產(chǎn)品族中的多個(gè)對象,增加或者替換產(chǎn)品族比較方便,增加新的具體工廠和產(chǎn)品族很方便;主要缺點(diǎn)在于增加新的產(chǎn)品等級結(jié)構(gòu)很復(fù)雜,需要修改抽象工廠和所有的具體工廠類,對“開閉原則”的支持呈現(xiàn)傾斜性。
抽象工廠模式適用情況包括:一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié);系統(tǒng)中有多于一個(gè)的產(chǎn)品族,而每次只使用其中某一產(chǎn)品族;屬于同一個(gè)產(chǎn)品族的產(chǎn)品將在一起使用;系統(tǒng)提供一個(gè)產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)。


其實(shí)抽象工廠的方法經(jīng)常以工廠方法的方式實(shí)現(xiàn)。而且在抽象工廠中還可以使用簡單工廠方法,著支付案例中就可以用簡單工廠方法獲取具體實(shí)例化哪個(gè)支付類,這邊就不再進(jìn)行說明。

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

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

  • 設(shè)計(jì)原則: 要依賴抽象,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,245評論 0 6
  • 抽象工廠模式 介紹 工廠方法模式通過引入工廠等級結(jié)構(gòu),解決了簡單工廠模式中工廠類職責(zé)太重的問題,但由于工廠方法模式...
    666真666閱讀 1,324評論 0 7
  • 前言 Android的設(shè)計(jì)模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 9,464評論 1 14
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,096評論 1 15
  • 炒栗子似乎一年四季都能吃到。 街道邊的小店里,無論什么時(shí)候都能看到成堆的炒栗子。小時(shí)候到如今,從未變過。走近那個(gè)街...
    十六幺閱讀 304評論 0 0

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