設計模式之工廠模式 三種工廠模式的實現方式

什麼是工廠模式?

工廠模式就是將對象的創建交由工廠來實現,程序只管使用其中具體的方法即可。

我們爲什麼要使用工廠模式?

1.將對象的創建和對象的使用分開,降低耦合度,提供代碼重複利用率;

2.後期對於創建對象的修改成本小。

雖然工廠模式有這麼優勢,但是並不是所有的場景都適用於工廠模式。我們總不能把所有的需要創建對象的地方都換成工廠模式吧?那就有點爲了使用設計模式而使用工廠模式了。

那麼什麼場景下,適合使用工廠模式呢?

1. 對象的創建過程/實例化準備工作很複雜,需要初始化很多參數、查詢數據庫等。其中的參數設置錯誤,就比較影響客戶的使用。

例如:

一個數據庫工廠:可以返回一個數據庫實例,可以是mysql,oracle等。

這個工廠就可以把數據庫連接需要的用戶名,地址,密碼等封裝好,直接返回對應的數據庫對象就好。不需要調用者自己初始化,減少了寫錯密碼等等這些錯誤。調用者只負責使用,不需要管怎麼去創建、初始化對象。

2.類本身有好多子類,這些類的創建過程在業務中容易發生改變,或者對類的調用容易發生改變。

工廠模式從簡單到複雜可以分爲三大類,分別是簡單工廠模式、工廠方法模式、抽象工廠模式。大家可以根據自己的應用場景來選擇,下面進行逐一介紹。

簡單工廠模式

有一個工廠類,負責產出產品。通過工廠類的一個方法返回產品(返回的類型是抽象產品類)。不過產品多種多樣,具體的產品類要繼承自這個抽象產品類。具體類圖如下:

工廠方法模式

簡單工廠模式只是讓一類對象的創建讓工廠管理了起來。但是對於軟件設計中的開閉原則(即對擴展開放,對修改封閉)遵循的並不好。比如,我們要想增加一個產品,必須在工廠類中修改代碼。而工廠方法模式就可以規避這個問題。當有新的產品時,增加一個具體的產品類繼承自抽象產品類,再增加一個新的工廠類繼承自抽象工廠類。然後讓新的工廠類和新的產品類關聯起來。這樣就遵循了開閉原則。具體類圖如下:

工廠方法模式雖然符合了開閉原則,但是代碼量比以前大了。我們要想產新的產品,必須寫一個新的工廠類,繼承抽象工廠類。爲了減少代碼量,可以使用類模板(利用泛型,創建工廠類時,傳入具體的產品類,以實現生產對應產品的作用),具體類圖如下:

抽象工廠模式

我們有時候需要的不僅僅是一類產品,可能是一套產品,比如,生產一支筆,不僅要生產筆芯,還有生產筆桿。

筆芯可以是A1廠的,也可以是A2廠的。筆桿可以是B1廠的,也可以是B2廠的。

那麼我們的抽象工廠類,就不能只有一個create方法,應該有兩個,一個製造A類產品,一類製造B類產品。

具體類圖如下:

這種模式的弊端也是比較明顯的,每增加一類新的產品,就要同時修改工廠接口和其實現類。我們可以將其優化成簡單工廠模式。每類產品通過簡單工廠類進行生產,然後調用者自由組合。這樣工廠就只涉及一個簡單工廠,沒有繼承關係了。

類圖如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章