首頁 > 科技

阿里P8技術大牛的Java工廠模式總結,在GitHub上一天已獲贊上萬!

2021-06-07 21:44:00

1、工廠模式簡介

模式介紹:它提供了種創建物件的最佳式,在創建物件時 不會對客戶端暴露創建邏輯,並且是通過使個共同的接來指向新創建的物件。

例:

產電腦,除了 A 品牌、還可以產B、C、D品牌電腦;

業務開發中,付很常,有統下單和付接 ,具體的付實現可以微信、付寶、銀卡等;

模式有 3 種不同的實現式:

① 簡單模式(靜態工廠):通過傳相關的類型來返回相應的類,這 種式較單 ,可擴展性相對較差。

② 法模式:通過實現類實現相應的法來決定相應的返回結果,這種式的可擴展性較強。

③ 抽象模式:基於上述兩種模式的拓展,且持細化產品。

應場景:

解耦:分離職責,把複雜物件的創建和使的過程分開。

復程式碼 降低維護成本:如果物件創建複雜且多處需到,如果每處都進編寫,則很多重複程式碼,如果業務邏輯發了改 變,需四處修改;使模式統創建,則只要修改類即可, 降低成本。

2、工廠模式——簡單工廠模式

稱靜態法,可以根據參數的不同返回不同類的例項,專定義個類來負責創建其他類的例項,被創建的例項通常都具有共同的類。由於法是靜態法,可通過類名直接調,且只需要傳簡單的參數即可。

核組成:

Factory:類,簡單模式的核,它負責實現 創建所有例項的內部邏輯。

IProduct:抽象產品類,簡單模式所創建的所有物件的類,描述所有例項所共有的公共接。

Product:具體產品類,是簡單模式的創建標。

實現步驟:

創建抽象產品類,有產品的抽象法,由具體的產 品類去實現。

創建具體產品類,繼承了他們的類,並實現具體法。

創建類,提供了個靜態法createXXX()來產產品,只需要傳你想產品名稱。

優點:將物件的創建和物件本身業務處理分離可以降低系統的 耦合度,使得兩者修改起來都相對容易。

缺點:

類的職責相對過重,增加新的產品需要修改類的判斷邏輯,這點與開閉原則是相違背。

即開閉原則(Open Close Principle)對擴展開放,對修改關閉,程式需要進拓展的時候,不能去修改原有的程式碼,實現個熱插拔的效果。

將會增加系統中類的個數,在定程度上增加了系統的複雜度和理解難度,不利於系統的擴展和維護,創建簡單物件就不模式。

下面我們來簡單使用一下簡單(靜態)工廠設計模式:

我們簡單使用虛擬碼模擬一下支付流程:

創建 IProduct 抽象產品介面——IPay

創建 Product 具體產品類——AliPay/WeChatPay

AliPay.java

WeChatPay.java

創建Factory工廠類——SimplePayFactory

測試使用簡單支付工廠:

上述就是工廠設計模式——簡單工程(靜態工廠的一個簡單使用例子),那麼我們來分析下其缺點與不足之處:

需求:

如果我需要額外再新增一個 A 銀行的銀行卡支付,那麼就需要在SimplePayFactory 類中新增響應的判斷邏輯,比如再加一個if判斷,新增一個 A 銀行支付的邏輯。

而如果再需要一個 B 銀行的銀行卡支付,那麼還需要再新增一個if判斷 新增一個 B 銀行支付的邏輯,依次加下去…

那麼這就違背了類要遵循的開閉原則(Open Close Principle)(對擴展開放,對修改關閉,程式需要進拓展的時候,不能去修改原有的程式碼,實現個熱插拔的效果),這樣就導致,每次擴展功能的時候都需要新增新的邏輯,並且需要對工廠類進行修改,如果是真實複雜的業務,這就增加了成本。

下面我們來看一下工廠方法模式是如何解決簡單工廠模式的這一缺點:

3、工廠模式——工廠方法模式

稱模式,是對簡單模式的進步抽象化,其好處是可以使系統在不修改原來程式碼的情況下引進新的產品,即滿開閉原則。

通過類定義負責創建產品的公共接,通過類來確定所需要創建的類型。

相簡單,此種法具有更多的可擴展性和復性,同時也增強了程式碼的可讀性。

將類的例項化(具體產品的創建)延遲到類的類 (具體)中完成,即由類來決定應該例項化哪 個類。

核組成部分:

IProduct:抽象產品介面,描述所有例項所共有的公共接。

Product:具體產品類,實現抽象產品類的接, 類創建物件,如果有多個需要定義多個。

IFactory:抽象介面,描述具體的公共接。

Factory:具體類,實現創建產品類物件,實現抽 象類的接,如果有多個需要定義多個。

要實現工廠方法模式,只需要在原來的簡單工廠模式基礎上,做出改進,而之前我們創建的IPay抽象產品介面和AliPay 、WeChatPay 兩個具體產品類不需要改動。

首先創建IPayFactory抽象介面:

然後創建AliPayFactory和WeChatFactory 兩個具體類:

進行測試:

工廠方法模式思路如下圖:

工廠方法模式優點

符合開閉原則,增加個產品類,只需要實現其他具體的產品類和具體的類;符合單職責原則,每個只負責產對應的產品;工廠方法模式缺點

增加個產品,需要實現對應的具體類和具體產品類;每個產品需要有對應的具體和具體產品類;4、工廠模式——抽象工廠方法模式

抽象法模式是簡單工廠模式 和工廠方法模式的整合升級版。象模式在 Spring 中應得最為泛的種設計模式。

背景:

法模式引等級結構,解決了簡單模式中類職責過重的問題。

但法模式中每個只創建類具體類的物件, 後續發展可能會導致類過多,因此將些相關的具體類組成個「具體類族」,由同個來統產, 強調的是系列相關的產品物件!!!

實現步驟分別是以下:

1、定義兩個接 IPay(支付)、IRefund(退款)。

2、創建具體的 Pay產品、創建具體的 Refund 產品。

3、創建抽象 IOrderFactory 接 兩個法 createPay/createRefund。

4、創建付寶產品族 AliOderFactory,實現 OrderFactory 抽象。

5、創建微信付產品族 WechatOderFactory,實現 OrderFactory 抽象。

6、定義個超級創造器 FactoryProducer,通過傳遞參數獲取對應的。

接下來我們就按照步驟使用一下抽象工廠方法模式:

1、定義兩個接 IPay(支付)、IRefund(退款):

2、創建具體的 Pay 產品、創建具體的 Refund 產品:

AliPay/WeChatPay:支付寶支付和微信支付

AliRefund/WeChatFund:支付寶退款和微信退款

3、創建抽象 IOrderFactory 接 兩個法 createPay/createRefund:

4、創建付寶產品族AliOderFactory,實現OrderFactory 抽象:

5、創建微信付產品族WechatOderFactory,實現 OrderFactory抽象

6、定義個超級創造器FactoryProducer,通過傳遞參數獲取對應的

最後我們來進行測試:

結果如下:

法模式和抽象法模式

從上面案例可以看出,抽象工廠模式是工廠方法模式和靜態工廠模式的合併,即超級工廠使用的是簡單工廠模式,受超級工廠管轄的工廠使用的是工廠方法模式。如圖:


IT145.com E-mail:sddin#qq.com