1. 程式人生 > >策略模式和工廠模式的區別

策略模式和工廠模式的區別

工廠模式是建立型模式
策略模式是行為性模式
一個關注物件建立
一個關注行為的封裝
策略模式就是定義一系列的演算法,這些演算法可以在需要的時候替換和擴充套件.工廠模式是生成型的模式,在你需要的時候構建具體的例項.

在下面的情況下應當考慮使用策略模式:
1. 如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為,那麼使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為。
2. 
一個系統需要動態地在幾種演算法中選擇一種。那麼這些演算法可以包裝到一個個的具體演算法類裡面,而這些具體演算法類都是一個抽象演算法類的子類。換言之,這些具體
演算法類均有統一的介面,由於多型性原則,客戶端可以選擇使用任何一個具體演算法類,並只持有一個數據型別是抽象演算法類的物件。
3. 一個系統的演算法使用的資料不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的複雜的和只與演算法有關的資料。
4. 如果一個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。此時,使用策略模式,把這些行為轉移到相應的具體策略類裡面,就可以避免使用難以維護的多重條件選擇語句,並體現面向物件設計的概念。

 策略模式的優點和缺點
策略模式有很多優點和缺點。它的優點有:
1. 策略模式提供了管理相關的演算法族的辦法。策略類的等級結構定義了一個演算法或行為族。恰當使用繼承可以把公共的程式碼移到父類裡面,從而避免重複的程式碼。
2. 
策略模式提供了可以替換繼承關係的辦法。繼承可以處理多種演算法或行為。如果不是用策略模式,那麼使用演算法或行為的環境類就可能會有一些子類,每一個子類提
供一個不同的演算法或行為。但是,這樣一來演算法或行為的使用者就和演算法或行為本身混在一起。決定使用哪一種演算法或採取哪一種行為的邏輯就和演算法或行為的邏輯
混合在一起,從而不可能再獨立演化。繼承使得動態改變演算法或行為變得不可能。
3. 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把採取哪一種演算法或採取哪一種行為的邏輯與演算法或行為的邏輯混合在一起,統統列在一個多重轉移語句裡面,比使用繼承的辦法還要原始和落後。
策略模式的缺點有:
1. 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著客戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法類。換言之,策略模式只適用於客戶端知道所有的演算法或行為的情況。
2. 策略模式造成很多的策略類。有時候可以通過把依賴於環境的狀態儲存到客戶端裡面,而將策略類設計成可共享的,這樣策略類例項可以被不同客戶端使用。換言之,可以使用
享元模式
來減少物件的數量。 策略模式與很多其它的模式都有著廣泛的聯絡。Strategy很容易和Bridge模式相混淆。雖然它們結構很相似,但它們卻是為解決不同的問題 而設計的。Strategy模式注重於演算法的封裝,而Bridge模式注重於分離抽象和實現,為一個抽象體系提供不同的實現。Bridge模式與 Strategy模式都很好的體現了"Favor composite over inheritance"的觀點。