什麼是工廠模式?
工廠模式就是將對象的創建交由工廠來實現,程序只管使用其中具體的方法即可。
我們爲什麼要使用工廠模式?
1.將對象的創建和對象的使用分開,降低耦合度,提供代碼重複利用率;
2.後期對於創建對象的修改成本小。
雖然工廠模式有這麼優勢,但是並不是所有的場景都適用於工廠模式。我們總不能把所有的需要創建對象的地方都換成工廠模式吧?那就有點爲了使用設計模式而使用工廠模式了。
那麼什麼場景下,適合使用工廠模式呢?
1. 對象的創建過程/實例化準備工作很複雜,需要初始化很多參數、查詢數據庫等。其中的參數設置錯誤,就比較影響客戶的使用。
例如:
一個數據庫工廠:可以返回一個數據庫實例,可以是mysql,oracle等。
這個工廠就可以把數據庫連接需要的用戶名,地址,密碼等封裝好,直接返回對應的數據庫對象就好。不需要調用者自己初始化,減少了寫錯密碼等等這些錯誤。調用者只負責使用,不需要管怎麼去創建、初始化對象。
2.類本身有好多子類,這些類的創建過程在業務中容易發生改變,或者對類的調用容易發生改變。
工廠模式從簡單到複雜可以分爲三大類,分別是簡單工廠模式、工廠方法模式、抽象工廠模式。大家可以根據自己的應用場景來選擇,下面進行逐一介紹。
簡單工廠模式
有一個工廠類,負責產出產品。通過工廠類的一個方法返回產品(返回的類型是抽象產品類)。不過產品多種多樣,具體的產品類要繼承自這個抽象產品類。具體類圖如下:
工廠方法模式
簡單工廠模式只是讓一類對象的創建讓工廠管理了起來。但是對於軟件設計中的開閉原則(即對擴展開放,對修改封閉)遵循的並不好。比如,我們要想增加一個產品,必須在工廠類中修改代碼。而工廠方法模式就可以規避這個問題。當有新的產品時,增加一個具體的產品類繼承自抽象產品類,再增加一個新的工廠類繼承自抽象工廠類。然後讓新的工廠類和新的產品類關聯起來。這樣就遵循了開閉原則。具體類圖如下:
工廠方法模式雖然符合了開閉原則,但是代碼量比以前大了。我們要想產新的產品,必須寫一個新的工廠類,繼承抽象工廠類。爲了減少代碼量,可以使用類模板(利用泛型,創建工廠類時,傳入具體的產品類,以實現生產對應產品的作用),具體類圖如下:
抽象工廠模式
我們有時候需要的不僅僅是一類產品,可能是一套產品,比如,生產一支筆,不僅要生產筆芯,還有生產筆桿。
筆芯可以是A1廠的,也可以是A2廠的。筆桿可以是B1廠的,也可以是B2廠的。
那麼我們的抽象工廠類,就不能只有一個create方法,應該有兩個,一個製造A類產品,一類製造B類產品。
具體類圖如下:
這種模式的弊端也是比較明顯的,每增加一類新的產品,就要同時修改工廠接口和其實現類。我們可以將其優化成簡單工廠模式。每類產品通過簡單工廠類進行生產,然後調用者自由組合。這樣工廠就只涉及一個簡單工廠,沒有繼承關係了。
類圖如下: