我正在阅读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();
...
}
}
谢谢,
答案 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类,对每种操作类型都有单独的调用,继承提供了更大的好处。
这有什么帮助?