之前在代码重构书中有了解过java中的反射机制可以消除switch-case,详情可以参考这篇博客http://blog.csdn.net/wwh578867817/article/details/49309789。那么我们的C++有没有类似干掉switch-case的方法?
1原始的工厂是如何创建派生类对象的
假如我们有个基类为Father,它有好多继承类分别为Son1,Son2,…
那么我们原始工厂(用来创建其子类对象)方法也就是用switch-case来实现
伪代码如下
Message* create(int type)
{
switch (type)
{
case _Son1_:
m = new Son1;
break;
case _Son2_:
m = new Son2;
break;
case _Son3_:
m = new Son3;
break;
case _Son4_:
m = new Son4;
break;
case __Son5:
m = new Son5;
break;
default:
break;
}
}
如果我们的case语句少点还好,一旦有好多的case语句,我们的代码维护起来就会变得很麻烦,那么我们有什么办法可以像java的反射机制一样干掉常常的switch-case语句呢?
2.自动注册的对象工厂
没错我们可以实现一个有自动注册功能的对象工厂就可以干掉switch-case了
为什么其可以干掉switch-case?
首先我们的自动注册对象工厂会维护一个map集合,该map的key便是我们上述的switch-case里的type,value为一个可调用对象,该可调用对象会调用具体某个Son类的构造函数,然后返回新生成对象的额指针。在每个子类的头文件中,我们就会将该子类的type和对应的可调用对象插入到map中,这样当我们程序中要生成某个具体子类对象时,我们的工厂便会更具type找到map中对应的可调用对象,然后执行可调用对象便可生成该type所对应的类对象了
具体实现如下
我们把父类看做基础消息,命名为Message,继承其的消息分别为Message2…等
父类代码