DP中提出的singleton模式不可以被用来当做继承基类的,每次要按照singleton的规则来设计一个singleton类是很痛苦的事,特别是当程序中singleton频繁出现的时候。MCD中的singleton也是外包的,这是一个singleton被用做基类的实现,不过跟语言相关了,用在C++中是没有问题的。
下面是该模板类的实现:
template<class SubClass>
class Singleton
{
private:
static SubClass *_instance;
static bool _create_by_instance;
public:
static SubClass * Instance();
protected:
Singleton()
{
if(!_create_by_instance)
throw std::runtime_error ("can't create object by subclass";
}
};
template<class SubClass>
SubClass * Singleton<SubClass>::Instance ()
{
if( _instance == 0)
{
_create_by_instance = true; //表明调用者身份
//异常处理
try
{
_instance = new SubClass();
}
catch(...)
{
_create_by_instance = false; //注销调用者身份
}
_create_by_instance = false; //注销调用者身份
}
return _instance;
}
template<class SubClass>
SubClass * Singleton<SubClass>::_instance = 0;
template<class SubClass>
bool Singleton<SubClass>::_create_by_instance = 0;
使用情况很简单:
class Machine : public Singleton<Machine> {...};
client 如果这样:Machine obj;
或者:Machine *pMch = new Machine;
Singleton都会抛出运行期异常,曾经有人提出过能不能在编译期识别出这些异常情况来,我认为是没有办法的,至少我没有想到过办法,当然,或许路过的各位高手有更好的解决办法,请指出。
本文地址:http://com.8s8s.com/it/it1084.htm