5

我有一个容器,它包含一堆指向基类的指针,以及一个函数,它接受一些输入并返回一个作为基类子类的类。它返回哪个子类取决于输入。

现在,我有一个像这样的巨大 switch 语句:

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:
        ...
    }
}

我想知道是否有更好的方法来设计这个。我不知道很多“设计模式”(我认为这就是他们所说的)所以我不知道是否有(明显的)更好的设计方法。

4

4 回答 4

6

您正在寻找的是工厂方法模式

这里重要的是消除基类对派生类实现的任何知识的需要。对于基类来说,了解派生类是一个糟糕的设计。

工厂方法模式解决了上述问题,因为创建发生在基类之外。

于 2011-07-16T05:53:40.337 回答
1

弄清楚你的意图有点困难,但如果你想根据一些输入参数创建一堆不同的子类,你可能需要考虑抽象工厂模式。

于 2011-07-16T05:48:57.903 回答
1

另一种方法是创建一个数组,您将在其中放置指向将调用相应构造函数的函数的指针。在您的depends() 中,您只会通过给定的输入调用您需要的函数。但是在这种方法中你需要 26 个函数

于 2011-07-16T05:49:28.777 回答
1

整数参数“输入”来自某个地方。您也许可以让创建该 int 的代码改为创建实际对象。如果您从磁盘或类似的东西读取 int,那将不起作用。

您可能会考虑设置不同的子类向创建它们的对象注册自己的情况。在这种情况下,工厂对象不需要在编译时知道子类。您可以在启动时使用全局变量来完成此操作,全局变量的构造函数为每个子类进行注册。您的 switch 语句更简单、更快,但这确实意味着您必须在更改子类时使 switch 保持最新。这是一种权衡,我认为您的解决方案不一定不如更精细的解决方案。

于 2011-07-16T06:27:28.127 回答