我们正在尝试将命令模式应用于我们的一个项目。每个命令对象都有不同种类和数量的参数。哪种模式最适合创建这些命令对象?我目前正在研究抽象工厂和构建器模式。我仍然是设计模式的业余爱好者。有人可以推荐一种最符合我要求的模式吗?
答案 0 :(得分:3)
据我所知,传统上没有用于创建命令的模式。这是命令模式的UML:
正如您在上面所看到的,ConcreteCommand
直接与CommandFactory.createCommand(...)
相关联,模式甚至表示它会创建它们。
每个命令对象都有不同种类和数量的参数。
此细节将难以将对象创建与客户端代码分离。
一种简单的方法是使用所谓的Simple Factory (aka Concrete Factory)。
这里的意图是使用new CommandA(...)
方法封装命令的创建。客户端代码不想知道createCommand(...)
等的详细信息。
但是,由于每个具体Command的构造函数具有不同的参数,因此您需要客户端将该信息提供给Client
方法。在我看来,这种模式不会带来太多好处,因为无论是否有模式,客户都必须提供几乎相同数量的细节。如果您不希望客户端知道ConcreteCommands的确切名称,那可能会很好。
例如,如果没有Simple Factory模式,new CommandA(arg1, arg2)
必须执行Client
(直接耦合到具体命令)。使用简单工厂模式,CommandFactory.createCommand("A", arg1, arg2)
必须执行CommandD
,其中“A”(或类似的东西)是ConcreteCommand要创建的判别式。如果您在设计中添加了Client
,那么createCommand("D", ...)
仍然需要更改(必须调用CommandFactory
)和您必须更新{ {1}}。看起来很复杂,效果不大。
使用工厂方法或抽象工厂模式似乎更复杂,但您的问题并未提供足够的细节以确定无疑。