回答

146

甲工廠模式是創建模式相同其它。策略模式是一種操作模式。換句話說,工廠模式用於創建特定類型的對象。策略模式用於以特定方式執行操作(或操作集合)。在典型的例子中,工廠可能會創建不同類型的動物:狗,貓,老虎,而戰略模式會執行特定的動作,例如移動;使用Run,Walk或者Lope策略。

其實兩者可以一起使用。例如,您可能有一個創建您的業務對象的工廠。它可能會根據持久性媒介使用不同的策略。如果您的數據本地存儲在XML中,它將使用一種策略。如果數據遠程位於不同的數據庫中,則會使用另一個數據庫。

20

策略模式允許您多態地改變一個類的行爲。

工廠模式允許您封裝對象創建。

加里說得很好。如果你使用抽象的原則而不是「結實」,那麼很多模式開始看起來像一個主題的變化。

15

只是爲了增加tvanfosson的說法,很多模式看起來和實現一樣。也就是說,你可以創建一個接口,在你的代碼中可能沒有一個接口,然後創建一個接口的實現。差異在於它們的目的以及它們的使用方式。

9
  • 工廠(方法)模式。

僅創建具體實例。不同的參數可能會導致不同的對象。這取決於邏輯等。

  • 戰略模式。

封裝算法(步驟)以執行操作。所以你可以改變策略並使用另一種算法。

雖然兩者看起來非常相似,但目的卻相當不同,其中一個目的是創建另一個就是執行一個動作。

所以。如果你的工廠方法是固定的,你可能會這樣:

public Command getCommand(int operatingSystem) { 
     switch(operatingSystem) { 
      case UNIX : 
      case LINUX : return new UnixCommand(); 
      case WINDOWS : return new WindowsCommand(); 
      case OSX  : return new OSXCommand(); 
     } 
    } 

但假設你的工廠需要更先進或動態創建。您可以向工廠方法添加策略並在無需重新編譯的情況下對其進行更改,策略可能會在運行時更改。

+0

我不認爲你在這裏做一個合適的點。首先,這些模式的原因之一是爲了避免有利於多態的條件。首先必須做出簡單工廠和抽象工廠之間的區別。d第一個是一個簡單的工廠,其中只有一個類用作對象創建的工廠,而後者則連接到一個接口,然後調用實現此接口的不同工廠,這些工廠應該具有不同的基於某些標準的相同方法。 (繼續) – interboy 2013-01-27 23:49:13

2

爲了擴大在什麼奧斯卡之稱,並參考其代碼:

的getCommand是廠家和UnixCommand,WindowsCommand和OSXCommand類是戰略

1

我可以在他的例子奧斯卡離題一個工廠的實施是相當緊密耦合,非常封閉,難怪你的選擇是戰略模式。工廠實現不應依賴於任何固定數量的特定類的實例化,例如:

public Command getCommand(int operatingSystem) {   
    return commandTable.get(operatingSystem); 
} 

... 

public class WindowsCommand implements Command { 
    ... 
    static { 
     CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand()); 
    } 

} 

我想最合適的標準來選擇一種或另一種主要是你僱用命名您的類和方法的條款,考慮到我們都應該傾向於編程接口而不是類,並且還關注目標:我們的目標是確定哪些代碼將在運行時執行。也就是說,我們可以通過使用這兩種模式來實現目標。

1

戰略和工廠是不同的目的。在策略中你定義了方法,使用這個模式你可以交換行爲(算法)。來到工廠周圍有很多變化。但是從GO4狀態工廠的原始模式將對象創建爲子類。在工廠中,您正在替換完整的實例而不是您感興趣的行爲。由此,您將取代完整的系統而不是算法。

5

首先是簡單工廠和抽象工廠之間的差異。第一個是一個簡單的工廠,其中只有一個類用作對象創建的工廠,而後者則連接到一個工廠接口(它定義方法名稱),然後調用實現此接口的不同工廠基於一些標準應該有相同方法的不同實現。例如,我們有一個ButtonCreationFactory接口,它由兩個工廠實現,第一個WindowsButtonCreationFactory(創建具有Windows外觀的按鈕)和第二個LinuxButtonCreationFactory(創建具有Linux外觀的按鈕)。所以這兩個工廠都有不同的實現(算法)具有相同的創建方法。你可以在運行時根據你想要的按鈕類型來引用它。

例如,如果你想用Linux的外觀和感覺的按鈕:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

,或者如果你想讓Windows按鈕

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory(); 
Button button1 = myFactory.createButton(...); 

正是在這種情況下,它會導致一種策略模式,因爲它區分用於做一些創建的算法。然而,它在語義上與它不同,因爲它用於OBJECT CREATION而不是運算法則。所以,基本上抽象工廠使用不同的策略來創建對象,這使得它與戰略模式非常相似。然而,AbstractFactory是創建的,而Strategy模式是可操作的。實施方面,他們的結果是一樣的。

0

工廠模式是創建模式,它是用指定的屬性(行爲)創建的。而在創建之後的運行時,您不能更改它的屬性(行爲)。所以如果你需要不同的屬性(行爲),你必須刪除對象,並創建具有所需屬性(行爲)的新對象。這是不是gud。 而在戰略模式的情況下,您可以在運行時更改屬性(行爲)。

0

只是通過查看代碼或分類,你無法理解差異。要正確掌握GoF模式,請查找他們的意圖:

策略:「定義一系列算法,封裝每個算法,並使它們可以互換。策略使算法獨立於使用它的客戶端。工廠方法:「定義一個創建對象的接口,但讓子類決定實例化哪個類。Factory方法讓類將實例化推遲到子類。」

這裏是關於意圖和這兩種模式之間的差異精心解釋:簡單來說Difference between Factory Method and Strategy design patterns

2

策略模式更是創造運行時的行爲,你不關心實現類。另一方面,工廠是具體類實例的運行時創建,您可以使用由實現的接口公開的任何行爲(方法)。

3

廠(和FactoryMethod返回由廠):基於繼承

  1. 創建模式
  2. 廠返回工廠方法(接口),這反過來又返回具體對象
  3. 你可以替換新的具體對象用於接口和客戶端(呼叫者)不應該知道所有具體的實現
  4. Cl ient總是隻能訪問接口,你可以隱藏對象創建的細節在工廠方法

看一看這個wikipedia articlejavarevisited article

策略模式:

  1. 這是一種行爲模式
  2. 它基於委託
  3. 它通過修改我改變對象的膽量的ThOD行爲
  4. 它用於家庭的算法之間切換
  5. 它改變在運行時對象的行爲

例子:

可以配置爲特定項目折扣策略(機票票或ShoppingCart項目)。在這個例子中,你將在七月至十二月期間對一件商品提供25%的折扣,並且在六月的Jaunary期間對這件商品沒有折扣。

相關文章:

Real World Example of the Strategy Pattern

Design Patterns: Factory vs Factory method vs Abstract Factory

相關問題