我有一个容器,它包含一堆指向基类的指针,以及一个接受一些输入并返回一个类的函数,该类是基类的子类。它返回的子类取决于输入。
现在,我有一个像这样的巨型开关声明:
class Base { ... }
class A : public Base { ... }
class B : public Base { ... }
...
class Z : public Base { ... }
Base* depends(int input) {
switch (input) {
case 1:
return new A(...);
case 2:
return new B(...);
...
case 26:
return new Z(...);
default:
...
}
}
我想知道是否有更好的方法来设计它。我不知道很多“设计模式”(我认为这就是他们所谓的)所以我不知道是否有一种(明显的)更好的方法来设计它。
答案 0 :(得分:6)
您要找的是 Factory Method pattern 。
这里重要的是消除Base类需要了解派生类实现的知识。对于Base类来说,了解Derived类是一个糟糕的设计。
Factory Method模式解决了上述问题,因为创建发生在Base类之外。
答案 1 :(得分:1)
有点难以弄清楚你想要的是什么,但如果你想根据一些输入参数创建一堆不同的子类,你可能想要考虑一个抽象工厂模式。
答案 2 :(得分:1)
另一种方法是创建一个数组,您将指向将调用相应构造函数的函数的指针。在您的depends()中,您只需通过给定的输入调用您需要的函数。但是在这种方法中你需要26种功能
答案 3 :(得分:1)
整数参数“input”来自某个地方。您可以让创建该int的代码改为创建实际对象。如果从磁盘或类似的东西读取int,那将无效。
您可以考虑设置一种情况,其中不同的子类将自己注册到创建它们的对象。在这种情况下,工厂对象在编译时不需要知道子类。您可以在启动时使用全局变量完成此操作,其构造函数会为每个子类进行注册。您的switch语句更简单,更快,但它确实意味着您必须在更改子类时保持交换机的最新状态。这是一种权衡,我不认为你的解决方案必然不如一个更精细的解决方案。