Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 工厂设计模式扩展_Design Patterns_Factory Pattern - Fatal编程技术网

Design patterns 工厂设计模式扩展

Design patterns 工厂设计模式扩展,design-patterns,factory-pattern,Design Patterns,Factory Pattern,我正在读《工厂》的章节。我正在考虑修改我的工作代码来实现它 首先,我使用GetAction创建IAction和ActionFactory,从IAction创建UploadDatabase、CopyFile、UploadSharepoint等。它位于DLL中,可以从exe调用。这很容易做到 然后,我计划从IAction创建AutoAdaction,其中包括打印、脚本等操作。这些操作只能在AutoCAD内部运行 现在我想用override GetAction创建AutoCADActionFactor

我正在读《工厂》的章节。我正在考虑修改我的工作代码来实现它

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

然后,我计划从IAction创建AutoAdaction,其中包括打印、脚本等操作。这些操作只能在AutoCAD内部运行

现在我想用override 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();
    }
}
我如何编写AutoAdactionFactory.GetAction,是否正确

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

        case ActionType.Script:
            return new Script();

        ...

    }
}

谢谢,

我不完全相信工厂,或者更准确地说,a(正如您试图使用它)是这里的正确选择。我这么说的原因是你似乎忽略了一些事情

通常,工厂方法在执行类似操作时最有意义,例如从不同格式的文件中读取位图图像。您定义的操作似乎差异很大,我不认为它们应该表示相同类型的操作(即支持相同的接口)。当然,您的操作没有理由不支持多个接口(例如,Print类可以同时实现IActionIPrint),但是如果没有其他信息,我确实想知道底层设计是否像它应该的那样可靠

由于您在ActionFactory和AutoAdactionFactory中使用相同的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的任何真正好处。对于类,每个操作类型都有单独的调用,继承提供了更大的好处

这些有帮助吗?

“现在我输了”?怎么用?请正确格式化您的代码,并详细说明您是如何丢失的。是什么阻止了你?你还需要知道什么?