工厂设计模式扩展

时间:2011-06-02 14:43:11

标签: design-patterns factory-pattern

我正在阅读Head First Design Pattern和工厂章节。我想改变一个我的工作代码来实现它。

首先我使用GetAction创建IAction和ActionFactory,从IAction创建UploadDatabase,CopyFile,UploadSharepoint等。这是在DLL中,可以从exe调用。这很容易做到。

然后我计划从IAction创建AutoCADAction,其中包括Print,Script等操作。这些操作只能在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();

        ...

    }
}

谢谢,

1 个答案:

答案 0 :(得分:2)

我并不完全相信工厂,或更正确的Factory Method(因为你似乎试图使用它)是正确的选择。我说的原因是你似乎忽视了一些事情。

通常,当您执行执行类似操作的操作时,工厂方法最有意义 - 例如,从各种格式的文件中读取位图图像。您定义的操作似乎变化很大,我不相信它们应该代表相同类型的操作(即支持相同的接口)。当然,您的操作不应该支持多个接口(例如打印类可以实现 IAction IPrint ),但是如果没有其他信息,我确实想知道底层设计是否像它应该的那样坚固。

因为您在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类,对每种操作类型都有单独的调用,继承提供了更大的好处。

这有什么帮助?