singleton即单件模式,实现这种模式的类在程序生命周期里只能有且仅有一个实例。

使用singleton,需要包括头文件:

#include <boost/serialization/singletion.hpp>
using boost::serialization::singleton;

类摘要:

template <typename T>
class singleton : public boost:noncopyable
{
    public:
    static const T & get_const_instance();
    static T&get_mutable_instance();
};

singleton把模板参数T时限为一个单件类,对类型T要求是有缺省的构造函数,而且在构造和析构时不能抛出异常,因为单件在mian() 前后构造和析构,如果发生异常时无法捕获的。

singleton提供两个静态成员函数访问单件实例,可分别获得常对象和可变对象。常对象单件总是线程安全,因为他不会改变内部状态,可变对象单件则不是线程安全的,可能发生线程竞争问题。

用法:

实现一个唯一的三维原点实例:

为了演示singleton的创建和销毁,增加了构造函数与析构函数:

class point
{
    public:
    point(int a=0,int b=0,int c=0) :x(a),y(b),z(c)
    {
        cout<<"point ctor"<<endl;
    }
    ~point()
    {
        cout<<"point dtor"<<endl;
    }
};

只需要把想成为单件的类作为它的模板参数就可以,接下来由singleton自动完成:

#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;
int main()
{
    cout<<"main() start"<<endl;
    typedef singleton<point> origin;
    
    origin::get_const_instance().print();
    origin::get_mutable_instance().print();
    
    cout<<"main() fiinish"<<endl;
}
//运行结果:
point ctor
main() start
0,0,0
0,0,0
main() finish
point dtor

除了模板方式,还可以通过继承的方式来使用:

#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;

class point:public singleton<point>
{...}
int main()
{
    cout<<"main() start"<<endl;
    typedef singleton<point> origin;
    
    origin::get_const_instance().print();
    origin::get_mutable_instance().print();
    
    cout<<"main() fiinish"<<endl;
}

继承的方式更为彻底一些。