使用TEMPLATE实现可复用SINGLETON模式
1. 实现简单的SINGLETON模式
class singleton
{
singleton()
public:
~singleton() { _instance = 0; }
static singleton * instance();
private:
static singleton *_instance;
}
singleton *singleton::instance()
{ return _instance ? _instance : _instance = new singleton; }
singleton *singleton::_instance=0;
这是GoF的Singleton模式的实现, 类图表示如下:
类中没有数据和操作,当我们每次需要一个singleton时,都要拷贝上面的那段代码,然后再加入相应的操作和数据。传统的复用技术(继承和聚合)现在无用武之地,我们只好求助于泛型设计。
2. 使用TEMPLATE实现SINGLETON模式
我们不能把singleton作为子类继承,通过继承的复用是没有意义的。可以确定singleton一定是叶子类,永远不能被继承。但是singleton却可以继承一个类,这种情况下,创建一个singleton的实例同时也会创建一个基类的实例,因为singleton只有一个实例,所以由singleton创建的基类的实例也只有一个。那好,我们再把基类设置为只能被子类创建吧!这样,我们就可以认为基类只有一个实例(实际上,基类可能被它的其它子类实例化)。
如果这样做的话,我们还是每次都要创建一个新的类。但是我们可以把这个任务交给编译器做。
类就改成模板:
template <class Data_base>
class singleton : public Data_base
{
singleton() {}
singleton(singleton &) {}
public:
~singleton() { _instance = 0; }
static singleton *instance();
private:
static singleton * _instance;
};
template <class Data_base>
singleton<Data_base> *singleton<Data_base>::instance()
{ return _instance ? _instance : _instance=new singleton<Data_base>; }
template <class Data_base>
singleton<Data_base> *singleton<Data_base>::_instance = 0;
创建一个数据基类:
class myData
{
protected:
myData() {}
myData(myData &) {}
~myData() {}
private:
int _intTest;
public:
int getInt()
{ return _intTest; }
void setInt(int intTest)
{ _intTest = intTest; }
};
引用singleton实例:
singleton <myData> * pInst = singleton<myData>::instance();
3. SINGLETON的其他应用——限定实例数目
某些时候,我们需要限定实例的个数。例如,一个FTP服务器,限定最大连接数为200。我们也可以通过SINGLETON来实现。以下给出singleton的实现。
template <class Data_base>
class singleton : public Data_base
{
singleton() {};
singleton(singleton &) {};
~singleton() {};
public:
static singleton *instance();
release();
static unsigned long get_max_instance()
{ return _max_instance; }
static void set_max_instance(unsigned long max_instance)
{ _max_instance = max_instance; }
private:
static unsigned long _counter;
static unsigned long _max_instance;
};
template <class Data_base>
unsigned long singleton<Data_base>::_counter = 0;
template <class Data_base>
unsigned long singleton<Data_base>::_max_instance = 200;
本文地址:http://com.8s8s.com/it/it29632.htm