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

2021-10-21 02:38:31 字數 2672 閱讀 4134

uml圖

例項在模式結構上,兩者很相似;

工廠模式是一種創造模式。戰略模式是一種運營模式。換句話說,工廠模式用於建立特定型別的物件。策略模式用於以特定方式執行乙個操作(或一組操作)。在經典示例中,工廠可能會建立不同型別的動物:狗,貓,老虎,而策略模式將執行特定的動作,例如,移動;使用「跑步」,「步行」或「移動」策略。

其實工廠模式和設計模式一直給人一種錯覺,總感覺是一樣的,沒有絲毫的區別。可以看下兩種模式的uml圖

從圖上來看,並沒有多大的區別,話不多說,從具體的**入手。

先寫乙個人的介面類,有eat,run,wear 3個方法

public

inte***ce

people

分別寫兩個實現類,乙個是小明的實現類,乙個是小紅的實現類

public

class

xiaoming

implements

people

@override

public

void

run(

)@override

public

void

wear()

}public

class

xiaohong

implements

people

@override

public

void

run(

)@override

public

void

wear()

}

簡單工廠模式的**

public

class

peoplefactory

else

if(name.

equals

("xiaohong"))

return null;

}}

再來看下策略模式的**

public

class

strategysign

public

strategysign

(string name)

else

if(name.

equals

("xiaohong"))

}public

void

run(

)}

策略模式的兩種構造方法都可以用,我多寫了一種是為了讓大家看到和工廠模式的區別和聯絡

然後我們通過測試類執行兩種模式

@test

public

void

testsign()

可以看到,兩種設計模式的執行結果是一模一樣的,那麼區別到底在哪呢。

從工廠模式的**中可以看到 工廠模式主要是返回的介面實現類的例項化物件,最後返回的結果是介面實現類中的方法,而策略模式是在例項化策略模式的時候已經建立好了,我們可以再策略模式中隨意的拼接重寫方法,而工廠模式是不管方法的拼接這些的,他只關注最後的結果,不注重過程,而策略模式注重的是過程。

用乙個具體的例子可以看下,如果我想小紅先吃飯再跑步再吃飯的話,那麼我需要在測試類中寫3種,而我只需要在策略模式的方法中直接定義即可。

可以看以下**:

public

class

strategysign

public

strategysign

(string name)

else

if(name.

equals

("xiaohong"))

}// 對行為進行了封裝

public

void

run()}

@test

public

void

testsign()

有人可能會說如果我在實現類中直接拼接好這些方法不是就好了麼?可是那樣的話我們每變更一次邏輯就要新增乙個方法,一次兩次還好,但是當邏輯多了以後,這些**會變得很冗餘,難以維護。而且從目前情況來看,工廠模式可以做到的事情,策略模式都可以做到。策略模式可以做到的事情,工廠模式也可以做到,只是會變得麻煩。

從上述的描述來看,策略模式就和我們常說的微服務很像,比如我們寫的3個介面,吃飯是乙個微服務,跑步是乙個微服務,穿衣是乙個微服務。策略模式的宗旨就是將各項方法之間連線起來,達到乙個新的方法,微服務的宗旨也是防止服務的多次呼叫,降低**的耦合度,因此這麼看來策略模式和微服務還是比較相像的。

總結下。 工廠模式中只管生產例項,具體怎麼使用工廠例項由呼叫方決定,策略模式是將生成例項的使用策略放在策略類中配置後才提供呼叫方使用。 工廠模式呼叫方可以直接呼叫工廠例項的方法屬性等,策略模式不能直接呼叫例項的方法屬性,需要在策略類中封裝策略後呼叫。

從上面的描述總結出,在執行時,兩者都是通過傳入引數進行配置,簡單工廠模式則是選擇建立出需要的物件,而策略模式則是配置出需要的行為演算法。乙個是物件建立,另乙個是行為演算法的替換。

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

工廠設計模式,用於建立複雜物件,管理多個不同功能介面 策略模式只是將同一功能的不同實現抽離出來,不需要管理物件 protocol nsobject id map getmap mapview功能 id location getlocation 定位功能 end 實現工廠協議獲取對應的物件 id ma...

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

首先來乙個工廠模式的例子 class factoryclass return classname abstract 注意這裡最好寫上返回值型別,在zend studio裡邊可以自動提示一些介面,public static function factory adapter,config array i...

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

最近一直在抽時間研究設計模式,之前對設計模式也有一定的了解,但是都沒有平心靜氣的去研究過,只是了解了一些皮毛,最近打算再深入研究一下,重新開啟了設計模式的資料,對之前的疑問乙個個的刨根問底,今天看了簡單工廠模式和策略模式看的人有點小暈,兩個的大概思路沒有怎麼變,都是通過多型去減少 的耦合度,怎麼看兩...