Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
4年前关闭。
我们正在尝试将命令模式应用于我们的项目之一。每个命令对象都有不同种类和数量的参数。哪种模式最适合创建这些命令对象?我目前正在研究抽象工厂和构建者模式。我仍然是设计模式的业余爱好者。有人可以推荐最适合我要求的模式吗?
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
4年前关闭。
我们正在尝试将命令模式应用于我们的项目之一。每个命令对象都有不同种类和数量的参数。哪种模式最适合创建这些命令对象?我目前正在研究抽象工厂和构建者模式。我仍然是设计模式的业余爱好者。有人可以推荐最适合我要求的模式吗?
最佳答案
据我所知,传统上没有用于创建命令的模式。这是命令模式的UML:
正如您在上面看到的,Client
直接与ConcreteCommand
耦合,该模式甚至说它创建了它们。
每个命令对象都有不同种类和数量的参数。
此细节将使将对象创建与客户端代码脱钩变得困难。
一种简单的方法是使用所谓的Simple Factory (aka Concrete Factory)。
这里的目的是通过使用CommandFactory.createCommand(...)
方法封装命令的创建。客户端代码不想知道new CommandA(...)
等的详细信息。
但是,由于每个具体Command的构造函数具有不同的参数,因此您需要客户端将该信息提供给createCommand(...)
方法。我认为,这种模式不会带来太大的好处,因为无论采用或不采用该模式,客户都必须提供几乎相同数量的详细信息。如果您不希望客户端知道具体命令的确切名称,则可能会很好。
例如,如果没有简单工厂模式,则Client
必须执行new CommandA(arg1, arg2)
(直接耦合到具体命令)。对于简单工厂模式,Client
必须执行CommandFactory.createCommand("A", arg1, arg2)
,其中“ A”(或类似名称)是ConcreteCommand创建的判别式。如果在设计中添加了CommandD
,则Client
仍需要更改(必须调用createCommand("D", ...)
),并且必须更新CommandFactory
。似乎很复杂,却没有什么好处。
使用“工厂方法”或“抽象工厂”模式似乎更加复杂,但是您的问题没有提供足够的细节来确定。