Singleton在不考虑destroy、register、threading safe等的时候很简单,但考虑的时候就复杂了,记录一下今天看的资料以及自己的认识。

写写今天做课程设计的时候设计的一个Platform类时应用的Singleton模式在destroy问题上查阅的一些资料以及自己的想法。汗一下,这么长的句子,呵呵。

Singleton之前在读书笔记里面写的很简单,因为Singleton的确比较容易理解的说,但是实际应用的时候才发现挺多问题的。

在不考虑destroy、register、threading safe的时候,Singleton很容易实现,真的很容易,就是最简单的那个例子,as follows:

class Singleton{
public:
    static Singleton* Instance();
protected:
    Singleton();
private:
    static Singleton* _instance;
};

Singleton* Singleton::_instance;
Singleton* Singleton::Instance(){
    if( _instance == 0){
        _instance = new Singleton;
    };
    return _instance;
}

考虑到注册的时候,就需要一个register以及table还有getInstance时查阅了。这个还是小事。

当考虑到回收的时候,就比较复杂了,网上有这么几种方法,一个是引用,一个是记数。
引用的概念是,对于_instance申明成static Singleton _instance;对于Instance()申明成Singleton & Instance();
记数的概念就是每次getInstance的时候获取增加一个引用记数,releaseInstance的时候减一个引用记数,根据引用记数来create和destroy,呵呵。

引用的缺陷在于无法很好的控制create和destroy的时机,这个显然并不是我们最想要的,但很简单。而记数的缺陷在于实现的复杂,今天看到的一个例子是用STL里面auto_ptr类,如果再加上考虑线程安全的话,会明显影响效率,呵呵,取舍吧。