2011-06-02 88 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类,每个动作类型都有不同的调用,继承提供了更大的好处。

这有帮助吗?