做網(wǎng)站定金是多少淘寶指數(shù)網(wǎng)站
目錄
- 1.1、前言
- 1.2、工廠方法模式簡介
- 1.2.1、工廠方法模式的主要特點(diǎn)
- 1.2.2、工廠方法模式的主要結(jié)構(gòu)
- 1.2.3、使用工廠方法模式的好處
- 1.3、SpringBoot中那些場景使用了工廠方法模式
- 1.4、日常工作中那些業(yè)務(wù)場景可以使用工廠方法模式
- 1.5、工廠方法模式實戰(zhàn)(以某商場一次促銷活動為例)
- 1.5.1、實戰(zhàn)場景簡介
1.1、前言
????????在開篇講工廠方法模式之前我們來看一個場景小故事,女媧補(bǔ)天的故事大家都聽說過吧,今天不說這個,說女媧創(chuàng)造人的故事,可不是“造人”的工作,這個詞被現(xiàn)代人濫用了。這個故事是說,女媧在補(bǔ)了天后,下到凡間一看,哇塞,風(fēng)景太優(yōu)美了,天空是湛藍(lán)的,水是清澈的,空氣是清新的,太美麗了,然后就待時間長了就有點(diǎn)寂寞了,沒有動物,這些看的到都是靜態(tài)的東西呀,怎么辦?
????????別忘了是神仙呀,沒有辦不到的事情,于是女媧就架起了八卦爐(技術(shù)術(shù)語:建立工廠)開始創(chuàng)建人,具體過程是這樣的:先是泥巴捏,然后放八卦爐里烤,再扔到地上成長,但是意外總是會產(chǎn)生的:
????????第一次烤泥人,茲茲茲茲,感覺應(yīng)該熟了,往地上一扔,biu~,一個白人誕生了,沒烤熟!
????????第二次烤泥人,茲茲茲茲茲茲茲茲,上次都沒烤熟,這次多烤會兒,往地上一扔,嘿,熟過頭了,黑人哪!
????????第三次烤泥人,茲~ 茲~ 茲~,一邊烤一邊看著,嘿,正正好,Perfect!優(yōu)品,黃色人種!
????????其實這個過程還是比較有意思的,如果我們要用程序去實現(xiàn)類似這樣的業(yè)務(wù)場景的話,大家會用什么方式呢?大多數(shù)人會說?ifelse語句呀,很簡單的。就業(yè)務(wù)場景而言使用ifelse語句來實現(xiàn)確實沒什么問題,但是如果有一天女媧一時興起想造“火星人”、“開普勒-10b人”、“比鄰星人”等一系列外星人又該怎么辦呢?大多數(shù)人還會說繼續(xù)?ifelse語句呀,很簡單的。我只想說這樣編碼下去只能是編碼?時爽,重構(gòu)?葬場。這也許是造成“屎山”代碼和很多?并不愿意接?別?的代碼的原因吧。
????????好的代碼不只為了完成現(xiàn)有功能,也會考慮后續(xù)擴(kuò)展。在結(jié)構(gòu)設(shè)計上松耦合易讀易擴(kuò)展,在領(lǐng)域?qū)崿F(xiàn)上?內(nèi)聚不對外暴漏實現(xiàn)細(xì)節(jié)不被外部干擾。工廠方法模式在這方面有著先天的優(yōu)勢,工廠方法模式也能更合理的實現(xiàn)上述女媧造人的業(yè)務(wù)場景。
1.2、工廠方法模式簡介
????????工廠方法模式(Factory Method Pattern)是一種創(chuàng)建型設(shè)計模式,它提供了一種創(chuàng)建對象的接口,但實際創(chuàng)建對象的工作由子類完成。這種模式的主要目的是降低類之間的耦合度,增強(qiáng)類的獨(dú)立性,并提高系統(tǒng)的可維護(hù)性和可擴(kuò)展性。
1.2.1、工廠方法模式的主要特點(diǎn)
- 分離了算法和對象創(chuàng)建:通過工廠方法,我們可以將對象的創(chuàng)建和使用分離,使得代碼更加清晰和易于維護(hù)。
- 實現(xiàn)多態(tài):工廠方法允許子類實現(xiàn)自己的行為,從而支持不同的創(chuàng)建策略。
- 避免使用new關(guān)鍵字:工廠方法模式通過工廠方法代替new關(guān)鍵字,可以減少錯誤,并提高代碼的可讀性和可維護(hù)性。
1.2.2、工廠方法模式的主要結(jié)構(gòu)
- 工廠(Factory):負(fù)責(zé)創(chuàng)建對象,但不暴露如何創(chuàng)建對象的實現(xiàn)細(xì)節(jié)。
- 抽象產(chǎn)品(Product):定義了產(chǎn)品對象的行為,但不暴露如何創(chuàng)建對象。
- 具體產(chǎn)品(Concrete Product):實現(xiàn)了抽象產(chǎn)品定義的行為,并提供了創(chuàng)建對象的實際邏輯。
- 客戶端(Client):使用工廠來獲取產(chǎn)品對象,并調(diào)用產(chǎn)品對象的行為。
1.2.3、使用工廠方法模式的好處
- 簡化客戶端代碼:客戶端只需要知道如何使用工廠來獲取對象,而不需要知道對象的創(chuàng)建細(xì)節(jié)。
- 提高代碼的可擴(kuò)展性:當(dāng)需要添加新的產(chǎn)品類型時,只需要創(chuàng)建一個新的具體產(chǎn)品類和相應(yīng)的工廠類即可,而不需要修改客戶端代碼。
- 降低類之間的耦合度:通過工廠方法模式,可以將對象的創(chuàng)建和使用分離,使得各個類之間的依賴關(guān)系更加清晰,提高了系統(tǒng)的可維護(hù)性和可擴(kuò)展性。
????????總之,工廠方法模式是一種常用的設(shè)計模式,它通過提供一種統(tǒng)一的接口來創(chuàng)建對象,降低了類之間的耦合度,提高了代碼的可擴(kuò)展性和可維護(hù)性。
1.3、SpringBoot中那些場景使用了工廠方法模式
-
Bean的創(chuàng)建:在Spring Boot中,通過工廠方法模式可以實現(xiàn)Bean的創(chuàng)建。Spring提供了一種方式讓我們自定義Bean的創(chuàng)建邏輯,即通過實現(xiàn)FactoryBean接口或使用@Bean注解來創(chuàng)建Bean。這樣可以更靈活地控制Bean的創(chuàng)建過程,實現(xiàn)定制化的Bean創(chuàng)建邏輯。
-
RestTemplate的創(chuàng)建:在Spring Boot中,RestTemplate是用于調(diào)用Restful服務(wù)的類,它通常會被注入到各個服務(wù)中。RestTemplate的創(chuàng)建可以通過工廠方法模式來實現(xiàn),將RestTemplate的創(chuàng)建邏輯封裝在一個工廠類中,并通過工廠方法來獲取RestTemplate對象,從而實現(xiàn)靈活配置和管理RestTemplate。
-
數(shù)據(jù)源的創(chuàng)建:在Spring Boot中,數(shù)據(jù)源是應(yīng)用程序連接數(shù)據(jù)庫的關(guān)鍵組件。通過工廠方法模式,可以將數(shù)據(jù)源的創(chuàng)建過程封裝在一個工廠類中,根據(jù)不同的配置信息來創(chuàng)建不同的數(shù)據(jù)源對象,實現(xiàn)多數(shù)據(jù)源的管理和靈活切換。
-
事件監(jiān)聽器的創(chuàng)建:在Spring Boot中,事件監(jiān)聽器用于監(jiān)聽?wèi)?yīng)用程序內(nèi)部的各種事件,如請求處理、對象創(chuàng)建銷毀等。通過工廠方法模式,可以實現(xiàn)事件監(jiān)聽器的靈活創(chuàng)建和管理,將事件監(jiān)聽器的創(chuàng)建邏輯封裝在工廠類中,并通過工廠方法來獲取監(jiān)聽器對象。
????????總之,工廠方法模式在Spring Boot中經(jīng)常被用于Bean的創(chuàng)建、RestTemplate的創(chuàng)建、數(shù)據(jù)源的創(chuàng)建、事件監(jiān)聽器的創(chuàng)建等場景中,通過工廠方法模式可以實現(xiàn)對象的靈活創(chuàng)建和管理,提高代碼的可擴(kuò)展性和可維護(hù)性。
1.4、日常工作中那些業(yè)務(wù)場景可以使用工廠方法模式
????????在日常工作中,工廠方法模式可以應(yīng)用于多種業(yè)務(wù)場景,尤其是當(dāng)需要在不同的條件下創(chuàng)建不同類型的對象時。以下是一些典型的業(yè)務(wù),適合使用工廠方法模式:
-
配置管理:當(dāng)系統(tǒng)需要根據(jù)不同的環(huán)境(如開發(fā)、測試、生產(chǎn))創(chuàng)建不同配置對象時,可以使用工廠方法模式。例如,不同環(huán)境的數(shù)據(jù)庫連接配置、緩存配置等。
-
數(shù)據(jù)導(dǎo)出:在需要將數(shù)據(jù)導(dǎo)出到不同格式(如CSV、Excel、PDF)的場景中,工廠方法模式可以用來創(chuàng)建導(dǎo)出器對象。
-
消息發(fā)送:類似郵件發(fā)送的示例,當(dāng)系統(tǒng)需要根據(jù)不同的消息類型(如短信、郵件、站內(nèi)通知)創(chuàng)建不同的消息發(fā)送器時,工廠方法模式非常適用。
-
服務(wù)集成:在微服務(wù)架構(gòu)中,不同的服務(wù)可能需要集成不同的第三方服務(wù)。使用工廠方法模式可以創(chuàng)建特定的服務(wù)集成器實例。
-
對象池管理:在需要對象池(如數(shù)據(jù)庫連接池、線程池)的場景中,工廠方法模式可以幫助實現(xiàn)對象的復(fù)用和管理。
-
插件系統(tǒng):當(dāng)系統(tǒng)需要動態(tài)加載和創(chuàng)建插件時,工廠方法模式可以用來創(chuàng)建插件實例,而不需要修改插件本身的代碼。
-
依賴注入:在Spring等框架中,工廠方法模式可以用來創(chuàng)建和注入依賴對象。例如,通過實現(xiàn)
FactoryBean
接口來定義自己的Bean創(chuàng)建邏輯。 -
異常處理:在需要根據(jù)不同的異常類型創(chuàng)建不同策略的場景中,工廠方法模式可以幫助定義不同的異常處理器。
-
資源管理:在需要根據(jù)不同資源類型(如文件、數(shù)據(jù)庫記錄)創(chuàng)建不同資源處理對象的場合,工廠方法模式可以提供一種靈活的解決方案。
-
UI組件創(chuàng)建:在Web應(yīng)用開發(fā)中,根據(jù)用戶配置或屏幕尺寸創(chuàng)建不同的UI也是工廠方法模式的適用場景。
????????工廠方法模式的優(yōu)點(diǎn)在于它提供了一個接口,允許子類決定實例化哪個類,使得實例化的過程延遲到子類中進(jìn)行,增強(qiáng)了程序的靈活性和可擴(kuò)展性。在設(shè)計系統(tǒng)時,如果預(yù)計到會有多種類型的對象需要創(chuàng)建,并且創(chuàng)建邏輯可能會隨著時間變化,那么工廠方法模式是一個很好的選擇。
1.5、工廠方法模式實戰(zhàn)(以某商場一次促銷活動為例)
1.5.1、實戰(zhàn)場景簡介
????????某地一商店為了回饋老客戶,針對滿足條件的老客戶發(fā)放對話卡、實物商品、優(yōu)惠券三種獎品。其業(yè)務(wù)場景圖如下:
????????大家可以提前想一想使用工廠方法模式如何實現(xiàn)上述業(yè)務(wù)場景,具體實現(xiàn)過程詳見下一篇博文工廠方法模式實戰(zhàn)之某商場一次促銷活動。