- 臨近秋招,備戰暑期實習,祝大家每天進步億點點!Day17
- 本篇總結的是 工廠設計模式,后續會每日更新~

1、工廠模式簡介
- ??模式介紹:它提供了?種創建物件的最佳?式,在創建物件時 不會對客戶端暴露創建邏輯,并且是通過使??個共同的接?來指向新創建的物件,
- 例?:
- ???產電腦,除了 A 品牌、還可以?產B、C、D品牌電腦;
- 業務開發中,?付很常?,??有統?下單和?付接 ?,具體的?付實作可以微信、?付寶、銀?卡等;
- ??模式有 3 種不同的實作?式:
- ① 簡單??模式(靜態工廠):通過傳?相關的型別來回傳相應的類,這 種?式?較單 ?,可擴展性相對較差,
- ② ???法模式:通過實作類實作相應的?法來決定相應的回傳結果,這種?式的可擴展性?較強,
- ③ 抽象??模式:基于上述兩種模式的拓展,且?持細化產品,
- 應?場景:
- 解耦:分離職責,把復雜物件的創建和使?的程序分開,
- 復?代碼 降低維護成本:如果物件創建復雜且多處需?到,如果每處都進?撰寫,則很多重復代碼,如果業務邏輯發?了改 變,需?四處修改;使???模式統?創建,則只要修改??類即可, 降低成本,
2、工廠模式——簡單工廠模式
-
?稱靜態???法,可以根據引數的不同回傳不同類的實體,專?定義?個類來負責創建其他類的實體,被創建的實體通常都具有共同的?類,由于???法是靜態?法,可通過類名直接調?,?且只需要傳?簡單的引數即可,
-
核?組成:
- Factory:??類,簡單??模式的核?,它負責實作 創建所有實體的內部邏輯,
- IProduct:抽象產品類,簡單??模式所創建的所有物件的?類,描述所有實體所共有的公共接?,
- Product:具體產品類,是簡單??模式的創建?標,
-
實作步驟:
- 創建抽象產品類,??有產品的抽象?法,由具體的產 品類去實作,
- 創建具體產品類,繼承了他們的?類,并實作具體?法,
- 創建??類,提供了?個靜態?法
createXXX()?來?產產品,只需要傳?你想產品名稱,
-
優點:將物件的創建和物件本身業務處理分離可以降低系統的 耦合度,使得兩者修改起來都相對容易,
-
缺點:
- ?類的職責相對過重,增加新的產品需要修改??類的判斷邏輯,這?點與開閉原則是相違背,
- 即開閉原則(Open Close Principle)對擴展開放,對修改關閉,程式需要進?拓展的時候,不能去修改原有的代碼,實作?個熱插拔的效果,
- 將會增加系統中類的個數,在?定程度上增加了系統的復雜度和理解難度,不利于系統的擴展和維護,創建簡單物件就不?模式,
下面我們來簡單使用一下簡單(靜態)工廠設計模式:
我們簡單使用偽代碼模擬一下支付流程:
創建 IProduct 抽象產品介面——IPay:
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:00
* @Description: IPay 抽象統一支付下單介面
*/
public interface IPay {
/**
* 統一下單
*/
void unifiedOrder();
}
創建 Product 具體產品類——AliPay/WeChatPay:
AliPay.java
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:29
* @Description: 支付寶支付具體實作類
*/
public class AliPay implements IPay{
@Override
public void unifiedOrder() {
System.out.println("支付寶支付統一下單...");
}
}
WeChatPay.java
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:30
* @Description: 微信支付具體實作類
*/
public class WeChatPay implements IPay{
@Override
public void unifiedOrder() {
System.out.println("微信支付統一下單...");
}
}
創建Factory工廠類——SimplePayFactory:
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:31
* @Description: 簡單支付工廠類(靜態工廠類)
*/
public class SimplePayFactory {
/**
* 工廠創建方法:
* 根據引數回傳對應的支付對象
*
* @param payType
* @return
*/
public static IPay createPay(String payType) {
if (payType == null) {
return null;
} else if (payType.equalsIgnoreCase("WECHAT_PAY")) {
return new WeChatPay();
} else if (payType.equalsIgnoreCase("ALI_PAY")) {
return new AliPay();
}
// 如果需要擴展,可以撰寫更剁
return null;
}
}
測驗使用簡單支付工廠:
@Test
public void testSimplePayFactory(){
IPay wechat_pay = SimplePayFactory.createPay("WECHAT_PAY");
IPay ali_pay = SimplePayFactory.createPay("ALI_PAY");
wechat_pay.unifiedOrder();
ali_pay.unifiedOrder();
}
// 輸出結果:
// 微信支付統一下單...
// 支付寶支付統一下單...
上述就是工廠設計模式——簡單工程(靜態工廠的一個簡單使用例子),那么我們來分析下其缺點與不足之處:
需求:
- 如果我需要額外再添加一個 A 銀行的銀行卡支付,那么就需要在
SimplePayFactory類中添加回應的判斷邏輯,比如再加一個if判斷,添加一個 A 銀行支付的邏輯, - 而如果再需要一個 B 銀行的銀行卡支付,那么還需要再添加一個
if判斷 添加一個 B 銀行支付的邏輯,依次加下去… - 那么這就違背了??類要遵循的開閉原則(Open Close Principle)(對擴展開放,對修改關閉,程式需要進?拓展的時候,不能去修改原有的代碼,實作?個熱插拔的效果),這樣就導致,每次擴展功能的時候都需要添加新的邏輯,并且需要對工廠類進行修改,如果是真實復雜的業務,這就增加了成本,
下面我們來看一下工廠方法模式是如何解決簡單工廠模式的這一缺點:
3、工廠模式——工廠方法模式
- ?稱??模式,是對簡單??模式的進?步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的產品,即滿?開閉原則,
- 通過???類定義負責創建產品的公共接?,通過?類來確定所需要創建的型別,
- 相?簡單????,此種?法具有更多的可擴展性和復?性,同時也增強了代碼的可讀性,
- 將類的實體化(具體產品的創建)延遲到??類的?類 (具體??)中完成,即由?類來決定應該實體化哪? 個類,
- 核?組成:
- IProduct:抽象產品介面,描述所有實體所共有的公共接?,
- Product:具體產品類,實作抽象產品類的接?,?? 類創建物件,如果有多個需要定義多個,
- IFactory:抽象??介面,描述具體??的公共接?,
- Factory:具體??類,實作創建產品類物件,實作抽 象??類的接?,如果有多個需要定義多個,
要實作工廠方法模式,只需要在原來的簡單工廠模式基礎上,做出改進,而之前我們創建的IPay抽象產品介面和AliPay 、WeChatPay 兩個具體產品類不需要改動,
首先創建IPayFactory抽象??介面:
/**
* @Auther: csp1999
* @Date: 2020/11/07/15:08
* @Description: 抽象??介面
*/
public interface IPayFactory {
IPay getPay();
}
然后創建AliPayFactory和WeChatFactory 兩個具體??類:
/**
* @Auther: csp1999
* @Date: 2020/11/07/15:09
* @Description: 具體工廠類 AliPayFactory
*/
public class AliPayFactory implements IPayFactory{
@Override
public IPay getPay() {
return new AliPay();
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/15:16
* @Description: 具體工廠類 WeChatFactory
*/
public class WeChatFactory implements IPayFactory{
@Override
public IPay getPay() {
return new WeChatPay();
}
}
進行測驗:
@Test
public void testMethodPayFactory(){
AliPayFactory aliPayFactory = new AliPayFactory();
IPay ali_pay = aliPayFactory.getPay();
ali_pay.unifiedOrder();// 輸出:支付寶支付統一下單...
WeChatFactory weChatFactory = new WeChatFactory();
IPay wechat_pay = weChatFactory.getPay();
wechat_pay.unifiedOrder();// 輸出:微信支付統一下單...
}
工廠方法模式思路如下圖:

工廠方法模式優點:
- 符合開閉原則,增加?個產品類,只需要實作其他具體的產品類和具體的??類;
- 符合單?職責原則,每個??只負責?產對應的產品;
工廠方法模式缺點:
- 增加?個產品,需要實作對應的具體??類和具體產品類;
- 每個產品需要有對應的具體??和具體產品類;
4、工廠模式——抽象工廠方法模式
抽象???法模式是簡單工廠模式 和工廠方法模式的整合升級版,象??模式在 Spring 中應?得最為?泛的?種設計模式,
背景:
- ???法模式引???等級結構,解決了簡單??模式中??類職責過重的問題,
- 但???法模式中每個??只創建?類具體類的物件, 后續發展可能會導致??類過多,因此將?些相關的具體類組成?個“具體類族”,由同?個??來統??產, 強調的是?系列相關的產品物件!!!
實作步驟:
- 1、定義兩個接?
IPay(支付)、IRefund(退款), - 2、創建具體的
Pay產品、創建具體的Refund產品, - 3、創建抽象??
IOrderFactory接? ??兩個?法createPay/createRefund, - 4、創建?付寶產品族
AliOderFactory,實作OrderFactory抽象??, - 5、創建微信?付產品族
WechatOderFactory,實作OrderFactory抽象??, - 6、定義?個超級??創造器
FactoryProducer,通過傳遞引數獲取對應的??,
接下來我們就按照步驟使用一下抽象工廠方法模式:
1、定義兩個接? IPay(支付)、IRefund(退款):
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:06
* @Description: 支付抽象介面
*/
public interface IPay {
/**
* 統一下單
*/
void unifiedOrder();
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:07
* @Description: 退款抽象介面
*/
public interface IReFund {
/**
* 退款
*/
void refund();
}
2、創建具體的 Pay 產品、創建具體的 Refund 產品:
AliPay/WeChatPay:支付寶支付和微信支付
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:29
* @Description: 支付寶支付具體實作類
*/
public class AliPay implements IPay {
@Override
public void unifiedOrder() {
System.out.println("支付寶支付 統一下單介面...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/11:30
* @Description: 微信支付具體實作類
*/
public class WeChatPay implements IPay {
@Override
public void unifiedOrder() {
System.out.println("微信支付統一下單...");
}
}
AliRefund/WeChatFund:支付寶退款和微信退款
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:35
* @Description:
*/
public class AliRefund implements IReFund {
@Override
public void refund() {
System.out.println("支付寶退款...");
}
}
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:40
* @Description:
*/
public class WeChatRefund implements IReFund {
@Override
public void refund() {
System.out.println("微信支付退款...");
}
}
3、創建抽象?? IOrderFactory 接? ??兩個?法 createPay/createRefund:
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:04
* @Description: 訂單抽象工廠,一個超級工廠可以創建其他工廠(又被稱為其他工廠的工廠)
*/
public interface IOrderFactory {
IPay createPay();
IReFund createRefund();
}
4、創建?付寶產品族AliOderFactory,實作OrderFactory 抽象??:
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:18
* @Description:
*/
public class AliOrderFactory implements IOrderFactory {
@Override
public IPay createPay() {
return new AliPay();
}
@Override
public IReFund createRefund() {
return new AliRefund();
}
}
5、創建微信?付產品族WechatOderFactory,實作 OrderFactory抽象??
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:39
* @Description:
*/
public class WeChatOrderFactory implements IOrderFactory {
@Override
public IPay createPay() {
return new WeChatPay();
}
@Override
public IReFund createRefund() {
return new WeChatRefund();
}
}
6、定義?個超級??創造器FactoryProducer,通過傳遞引數獲取對應的??
/**
* @Auther: csp1999
* @Date: 2020/11/07/16:46
* @Description: 工廠創造器
*/
public class FactoryProducer {
public static IOrderFactory getFactory(String type){
if (type.equalsIgnoreCase("WECHAT")){
return new WeChatOrderFactory();
}else if (type.equalsIgnoreCase("ALI")){
return new AliOrderFactory();
}
return null;
}
}
最后我們來進行測驗:
@Test
public void testAbstractMethodPayFactory(){
IOrderFactory wechatPayFactory = FactoryProducer.getFactory("WECHAT");
wechatPayFactory.createPay().unifiedOrder();
wechatPayFactory.createRefund().refund();
IOrderFactory aliPayFactory = FactoryProducer.getFactory("ALI");
aliPayFactory.createPay().unifiedOrder();
aliPayFactory.createRefund().refund();
}
結果如下:
微信支付統一下單...
微信支付退款...
支付寶支付 統一下單介面...
支付寶退款...
???法模式和抽象???法模式
- 從上面案例可以看出,抽象工廠模式是工廠方法模式和靜態工廠模式的合并,即超級工廠使用的是簡單工廠模式,受超級工廠管轄的工廠使用的是工廠方法模式,
- 如圖:

總結的面試題也挺費時間的,文章會不定時更新,有時候一天多更新幾篇,如果幫助您復習鞏固了知識點,還請三連支持一下,后續會億點點的更新!

為了幫助更多小白從零進階 Java 工程師,從CSDN官方那邊搞來了一套 《Java 工程師學習成長知識圖譜》,尺寸 870mm x 560mm,展開后有一張辦公桌大小,也可以折疊成一本書的尺寸,有興趣的小伙伴可以了解一下,當然,不管怎樣博主的文章一直都是免費的~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286284.html
標籤:java
