1、簡單工廠模式
定義:定義1個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。
問題:產品類的職責太重,違背了單1職責原則;如果增加新的職責,就要修改產品類的源代碼,違背了
開放―封閉原則。
解決方案:提供專門的工廠建立對象,將對象的使用和創建分開。
效果:
(1) 工廠類包括必要的判斷邏輯,可以決定在甚么時候創建哪個產品類的實例,客戶端可以避免除直接創建產品對象的職責,而僅僅“消費”產品。但是當工廠類負責創建的對象多的時候,邏輯判斷也特別復雜,不利于系統的擴大和保護。
(2) 客戶端不必知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數便可。
適用的范圍:
(1) 工廠類負責創建的對象比較少,由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜。
(2) 客戶端只知道傳入工廠類的參數,對如何創建對象其實不關心。
2、工廠方法模式(Factory Method)
定義:1個用于創建對象的接口,讓子類決定實例化哪個類。工廠方法使1個類的實例化延遲到其子類。
問題:在簡單工廠中工廠類的職責有時太大,如果需求增加,那末我們就要對工廠類中的邏輯判斷就要進行修改,這樣就背背了開放――封閉原則。
解決方案:根據依賴倒轉原則,下降工廠類與分支的耦合度,將工廠類抽象出1個接口,這個接口有1個創建抽象產品的工廠方法,要生產具體產品類的工廠去實現這個接口。
效果:工廠方法模式繼承了簡單工廠模式的優點,同時也彌補了簡單工廠模式的不足。但是工廠方法簡單工廠的內部邏輯判斷移到了客戶端代碼中,如果增加想要的功能,本來是改工廠類的,但現在是修改客戶端。
適用的范圍:
(1)、客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠 。
(2)、抽象工廠類通過其子類來指定創建哪一個對象。
3、抽象工廠模式(Abstract Factory)
定義:提供1個創建1系列相干或相互依賴對象的接口,而無需指定它們具體的類。
問題:在工廠方法模式的基礎上,如果再添加1個類型的產品,則還需要添加1個工廠類 ,這樣產生的類就會特別的多。 解決方案:建立1個抽象工廠的接口,里面包括所有的產品創建的抽象方法。
效果:提供了強大的工廠類,功能全面,但是等級結構復雜。
適用范圍:
(1)、系統中有多個產品族,且每一個產品族中的產品同時使用
(2)、產品等級結構穩定和設計完成后,不會向系統中增加新的產品等級結構或刪除已有的產品等級結構。
4、總結
工廠3兄弟中,他們是從低等級的不斷優化完善延伸出來的。他們都有自己的優缺點,適合的場合使用!