2012-04-13 115 views
2

在運行時,根據用戶行爲和歷史記錄,我需要執行排序操作。在我的情況下,SortByDate/SortByDemand/SortByConsumption只會返回字符串,或者我們可以說按子句排序(可能很複雜)。爲什麼不選擇工廠模式?

在大多數論壇中,我發現戰略模式應該用於排序。

enter image description here

我已經在這裏爲連接策略模式的圖像。 Util類將調用三個類中的一個的對象,即SortByDate/SortByDemand/SortByConsumption

所以每次定義一個新的排序方法時,我需要更改util類並定義一個新的策略。

enter image description here

但如果我實現它使用的工廠,UTIL類只需要調用工廠,它會照顧調用哪個類。所以我認爲我應該使用工廠。

但是我已經讀過這個策略是這種需求的最佳模式。爲什麼這裏的策略模式更好?

+0

基本上你shouldt感興趣的是什麼類型的數據suply爲處理該策略的類。你只需要向該類提供一些數據,並讓該類實現所需的策略。在工廠模式中,您需要了解數據和處理它的類。在戰略模式中,你不需要知道任何事情, – 2012-04-13 10:35:52

回答

1

策略是一種模式,旨在允許您在不破壞算法客戶端的情況下向軟件中添加新的(在您的案例中)算法。這是對設計複雜性的投資,如果您需要添加新的算法而不會打破客戶的話,這將會帶來回報。 Factory是一種補充Strategy的模式,因爲算法實現的客戶端不應該明確知道他們使用的是哪種實現(就軟件類而言)。工廠實例化算法的具體實現,以便客戶端可以在不知道細節的情況下使用它們。

這裏的靜態結構: enter image description here

這裏的動態:

enter image description here

+0

很棒的例子。 但我想知道如果我刪除SortstrategyInterface,那麼將來會遇到什麼樣的問題。 – chicharito 2012-04-14 17:04:43

+0

爲什麼?該接口是爲客戶提供各種受保護的變體。這是對兩種模式都至關重要的抽象,所以刪除它會破壞它們。 – Fuhrmanator 2012-04-14 22:28:20

+0

客戶只需致電工廠。 你可以給我一個例子,如果我刪除SortstrategyInterface,那麼它可以有什麼 – chicharito 2012-04-15 06:14:02

2

你所做的不是工廠模式,而是兩者的混合體,這在我看來並不明確,在我看來是錯誤的。

在第二個例子中,類名是錯誤的和令人困惑的。 SortByDateFactory不像工廠(它不會產生任何東西),但它確實表現得像一個策略。因此,它應該符合戰略接口。

另一方面,在第一個示例中,UtilClass的行爲與您想要製造的工廠相似。所以,我建議保留第一個示例,但將UtilClass重命名爲SortStrategyFactory

+0

我已更正類名稱。 你能解釋我的問題嗎? – chicharito 2012-04-14 16:52:26

1

這兩個圖看起來都像是策略模式,但是底部的一個模型稍微有些模糊。如果你想要一個工廠,這意味着utilclass將是抽象的,並有一個工廠方法,它實例化一個分類器類。分類器的具體類型由utilclass的特定子類定義。

策略模式的重點在於避免被綁定到類層次結構中,因此您可以將各種分類器與各種其他功能進行混合和匹配。當你使用utilclass的子類時,工廠是合適的,並且一個特定的子類(其餘部分都是功能性的)總是需要一個特定的分類器,而不是一個不同的分類器。根據您的需求選擇合適的產品。

+0

嗨,你可以PLZ使用類圖解釋它。 和我做錯了什麼? – chicharito 2012-04-14 16:57:01

0

您正在有效使用工廠策略工廠決定創建哪個策略; 策略執行排序邏輯。

由於您從工廠繼承了您的策略,因此您的底圖很混亂。工廠應該只需創建正確的策略。

客戶只是問工廠的策略和使用它。

+0

嗨 你可以使用類圖解釋它。 – chicharito 2012-04-14 16:54:13