1 引言
我的一个实际项目中,由于希望通过一致的接口控制各种型号的设备,并且可以方便的随时扩充,以便将来支持更多的型号。因此,必须在运行时指定设备的型号。
为了使应用程序可以透明的控制各种型号的设备,所以建立了一个简单的继承体系,设计一个协议类(Protocol Class)作为设备的控制接口,并且为每个型号的设备设计了一个具体的类,从协议类派生并且实现了抽象的公共接口。
因此,我需要一种手段,根据设备的型号在运行时动态的创建设备类实例。否则,如果在编译时硬编码(Hard Code)设备配置,将失去实用性和灵活性。
最终的结果是,需要这样一种技术,可以实现
Motor* motor=ClassByName("IM9001");
类似的功能。
2 设计和实现现有的关键类的代码片断如下:
class IntelligentMotor
{
public:
IntelligentMotor(const std::string& port_name);
virtual bool Start()=0;
virtual bool Stop()=0;
virtual ~IntelligentMotor();
};
class IM9001 : public IntelligentMotor
{
public:
IM9001(const std::string& port_name);
virtual bool Start();
virtual bool Stop();
virtual ~IM9001();
private:
// ...
};
class IM9002 : public IntelligentMotor
{
public:
IM9002(const std::string& port_name);
virtual bool Start();
virtual bool Stop();
virtual ~IM9002();
private:
// ...
};
// more model ...
如何实现ClassByName呢?
我们当然可以在ClassByName中使用一个多重分支检查来实现,也就是
IntelligentMotor* ClassByName(const std::string& model_name,
const std::string& port_name)
{
if (model_name=="IM9001")
return new IM9001(port_name);
else if (model_name=="IM9002")
return new IM9002(port_name);
// 所有支持的型号
else
throw "不支持该型号的设备。";
}
然而这种编程风格是糟糕的。随着系统支持的型号种类增加,分支检查语句的长度也会同时增加,造成代码尺寸膨胀和可维护性的下降。
http://www.56.com/p89/v_MTI0ODU1NTM0.html |
http://www.56.com/p82/v_MTI0ODU1NjE1.html |
http://www.56.com/p36/v_MTI0ODU1NjU3.html |
http://www.56.com/p73/v_MTI0ODU1Njk0.html |
http://www.56.com/p30/v_MTI0ODU1NzM5.html |
http://www.56.com/p77/v_MTI0ODU1Nzg2.html |
http://www.56.com/p31/v_MTI0ODU1ODI4.html |
http://www.56.com/p72/v_MTI0ODU1ODY5.html |
http://www.56.com/p36/v_MTI0ODU1OTIx.html |
http://www.56.com/p57/v_MTI0ODU1OTQy.html |
http://www.56.com/p30/v_MTI0ODU2MDAz.html |
http://www.56.com/p78/v_MTI0ODU2MDUx.html |
http://www.56.com/p41/v_MTI0ODU2MTAy.html |
http://www.56.com/p29/v_MTI0ODU2MTc4.html |
http://www.56.com/p82/v_MTI0ODU2MjMx.html |
http://www.56.com/p40/v_MTI0ODU2Mjc3.html |
http://www.56.com/p93/v_MTI0ODU2MzMw.html |
http://www.56.com/p55/v_MTI0ODU2Mzgw.html |
http://www.56.com/p29/v_MTI0ODU2NDQy.html |
http://www.56.com/p77/v_MTI0ODU2NDkw.html |
http://www.56.com/p31/v_MTI0ODU2NTMy.html |
http://www.56.com/p79/v_MTI0ODU2NTgw.html |
http://www.56.com/p65/v_MTI0ODU2NzQy.html |
http://www.56.com/p41/v_MTI0ODU2ODA2.html |
http://www.56.com/p17/v_MTI0ODU2ODcw.html |
http://www.56.com/p68/v_MTI0ODU2OTIx.html |
http://www.56.com/p37/v_MTI0ODU2OTc4.html |
http://www.56.com/p89/v_MTI0ODU3MDMw.html |
http://www.56.com/p89/v_MTI0ODU3MTE4.html |
http://www.56.com/p54/v_MTI0ODU3MTcx.html |
http://www.56.com/p32/v_MTI0ODU3MjM3.html |
http://www.56.com/p98/v_MTI0ODU3MzAz.html |
http://www.56.com/p67/v_MTI0ODU3MzYw.html |
http://www.56.com/p29/v_MTI0ODU3NDEw.html |
http://www.56.com/p56/v_MTI0ODU3NTI1.html |
http://www.56.com/p59/v_MTI0ODU3NjE2.html |
http://www.56.com/p37/v_MTI0ODU3Njgy.html |
http://www.56.com/p36/v_MTI0ODU3NzY5.html |
http://www.56.com/p80/v_MTI0ODU3ODEz.html |
http://www.56.com/p81/v_MTI0ODU3OTAy.html |
http://j.renren.com/album/1308211143499717194 |
http://j.renren.com/album/1308211144140700223 |
http://j.renren.com/album/1308211144277908860 |
http://j.renren.com/album/1308211144477059926 |
http://j.renren.com/album/1308211145001299068 |
http://j.renren.com/album/1308211145153868635 |
http://j.renren.com/album/1308211145267091880 |
http://j.renren.com/album/1308211145391797021 |
http://j.renren.com/album/1308211145551496277 |
http://j.renren.com/album/1308211146099580557 |
http://j.renren.com/album/1308211146268678625 |
http://j.renren.com/album/1308211146480258043 |
http://j.renren.com/album/1308211147045427845 |
http://j.renren.com/album/1308211147153231057 |
http://j.renren.com/album/1308211147295725711 |
http://j.renren.com/album/1308211147458911246 |
http://j.renren.com/album/1308211148164489251 |
http://j.renren.com/album/1308211148440778335 |
http://j.renren.com/album/1308211149067919726 |
http://j.renren.com/album/1308211149260990724 |
http://j.renren.com/album/1308210942289161150 |
http://j.renren.com/album/1308210942545942286 |
http://j.renren.com/album/1308210943113153616 |
http://j.renren.com/album/1308210943324233194 |
http://j.renren.com/album/1308210943482577750 |
http://j.renren.com/album/1308210944078962414 |
http://j.renren.com/album/1308210944258234050 |
http://j.renren.com/album/1308210944536211600 |
http://j.renren.com/album/1308210945377994557 |
http://j.renren.com/album/1308210946000290113 |
http://j.renren.com/album/1308210946231810773 |
http://j.renren.com/album/1308210946454306373 |
http://j.renren.com/album/1308210947029807745 |
http://j.renren.com/album/1308210947226620833 |
http://j.renren.com/album/1308210947500998159 |
http://photo.163.com/q/6646839/?mid=174327044 |
http://photo.163.com/q/6646836/?mid=174327044 |
http://photo.163.com/q/6646832/?mid=174327044 |
http://photo.163.com/q/6646828/?mid=174327044 |
http://photo.163.com/q/6646823/?mid=174327044 |
http://photo.163.com/q/6646815/?mid=174327044 |
http://photo.163.com/q/6646809/?mid=174327044 |
http://photo.163.com/q/6646802/?mid=174327044 |
http://photo.163.com/q/6646789/?mid=174327044 |
http://photo.163.com/q/6646779/?mid=174327044 |
http://photo.163.com/q/6654337/?mid=174322057 |
http://photo.163.com/q/6654328/?mid=174322057 |
http://photo.163.com/q/6654319/?mid=174322057 |
http://photo.163.com/q/6654309/?mid=174322057 |
http://photo.163.com/q/6654296/?mid=174322057 |
http://photo.163.com/q/6654285/?mid=174322057 |
http://photo.163.com/q/6654277/?mid=174322057 |