前言:策略模式和工廠模式看着很像,經常讓人混淆不清,本文將介紹這2種設計模式。
策略模式
- 定義
一個類的行爲或其算法可以在運行時更改
。這種類型的設計模式屬於行爲型模式
- 適用場景
- 如果在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲。
- 一個系統需要動態地在幾種算法中選擇一種。
- 如果一個對象有很多的行爲,如果不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。
- 模式結構
- 環境(Context):持有一個Strategy的引用
- 抽象策略(IStrategy):策略接口
- 具體策略實現(StrategyImpl):包裝(實現)了相關的算法或行爲
- 優缺點
優點:算法可以自由切換;避免使用多重條件判斷;擴展性良好
缺點:策略類會增多;所有策略類都需要對外暴露
工廠模式
- 定義
一個創建產品對象的工廠接口,將產品對象的實際創建工作推遲到具體子工廠類當中。這滿足創建型模式中所要求的創建與使用相分離
的特點。工廠模式屬於創建型模式
- 類別
-
簡單工廠模式(Simple Factory)
簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。 -
工廠方法模式(Factory Method)
工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了面向對象的多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有產品的創建,而是將具體創建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的接口,而不負責產品類被實例化這種細節,這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。 -
抽象工廠模式(Abstract Factory)
此模式是對工廠方法模式的進一步擴展。在工廠方法模式中,一個具體的工廠負責生產一類具體的產品,即一對一的關係,但是,如果需要一個具體的工廠生產多種產品對象,那麼就需要用到抽象工廠模式了。
- 示例
三種工廠創建示例參照 工廠模式創建
策略模式與工廠模式比較
- 相似點
在模式結構上,兩者很相似。都是利用接口,子類去實現(繼承和多態)。 - 差異
- 用途不一樣
工廠是創建型模式
,它的作用就是創建對象;
策略是行爲型模式,
它的作用是讓一個對象在許多行爲中選擇一種行爲; - 關注點不一樣
一個關注對象創建
一個關注行爲
的封裝 - 解決不同的問題
工廠模式是創建型的設計模式,它接受指令,創建出符合要求的實例;它主要解決的是資源的統一分發,將對象的創建完全獨立出來,讓對象的創建和具體的使用客戶無關。主要應用在多數據庫選擇,類庫文件加載等。
策略模式是爲了解決的是策略的切換與擴展,更簡潔的說是定義策略族,分別封裝起來,讓他們之間可以相互替換,策略模式讓策略的變化獨立於使用策略的客戶。