2011-06-02 123 views
1

我在閱讀Head First Design Pattern並在Factory的章節。我正在考慮更改一個我的工作代碼來實現它。工廠設計模式擴展

首先我用IAction創建IAction和ActionFactory,從IAction創建UploadDatabase,CopyFile,UploadSharepoint等。這是在DLL中,可以從exe調用。這很容易並且完成。

然後我打算從IAction創建包含諸如打印,腳本等動作的AutoCADAction。這些動作只能在AutoCAD中運行。

現在我喜歡用重疊的GetAction創建AutoCADActionFactory,它也會創建ActionFactory和AutoCADAction。現在我輸了。

下面是示例代碼:

在ActionFactory.GetAction

public IAction GetAction(ActionType myActionType) 
{ 
    switch (myActionType) 
    { 
     case ActionType.UploadDatabase: 
      return new UploadDatabase(); 

     case ActionType.CopyFile: 
      return new CopyFile(); 

     case ActionType.UploadSharepoint: 
      return new UploadSharepoint(); 
    } 
} 

我如何代碼我AutoCADActionFactory.GetAction,這是正確的嗎?

public AutoCADAction GetAction(ActionType myActionType) 
{ 
    return Base.GetAction; 
    switch (myActionType) 
    { 
     case ActionType.Print: 
      return new Print(); 

     case ActionType.Script: 
      return new Script(); 

     ... 

    } 
} 

謝謝

+0

「現在我迷路了」?怎麼樣?請正確格式化您的代碼,並請詳細說明您是如何丟失的。什麼阻止你?你還需要知道什麼? – 2011-06-02 14:44:30

回答

2

我不完全相信,一個工廠,或者更正確地將Factory Method(你似乎想使用它)是這裏的正確選擇。我說這個的原因是你似乎忽視了一些事情。

通常情況下,工廠方法對於執行類似操作的操作非常有意義 - 例如從各種格式的文件中讀取位圖圖像。您定義的操作似乎差異很大,我不相信它們應該表示相同類型的操作(即支持相同的界面)。當然,沒有理由你的行爲不應該支持多個接口(例如類可能實現IActionIPrint),但沒有額外的信息,我不知道底層設計是否如實因爲它應該是。

因爲您在ActionFactory和AutoCADActionFactory中使用相同的ActionType枚舉,您可能需要/需要定義由ActionFactory返回的「null」操作。 (根據上下文,您可能希望null動作執行一些有用的操作 - 例如彈出一個消息框,指出「該操作在此上下文中不受支持」,但它可能完全沒有任何作用。)null操作應該在「默認」情況下返回。

按照當前編碼,你將會從總是返回基類的動作。你可能想要的東西,看起來更像是這樣的:

public AutoCADAction GetAction(ActionType myActionType) 
{ 
    switch (myActionType) 
    { 
     case ActionType.Print: 
      return new Print(); 

     case ActionType.Script: 
      return new Script(); 

     default: 
      return base.GetAction(myActionType); 
    } 
} 

這將讓你徹底取代由ActionFactory(我想象會想最有可能的事)提供的動作,或者專門做的事情一樣除了基類的動作之外,還返回一個專門的動作來執行一些特定的操作。

您可能還想考慮常見的面向對象的原則,以「贊成封裝繼承」。在這種情況下,我沒有看到從ActionFactory繼承的任何真正的好處。對於Abstract Factory類,每個動作類型都有不同的調用,繼承提供了更大的好處。

這有幫助嗎?