【剑指offer】实现Singleton模式

题目:设计一个类,我们只能生成该类的一个实例


不好的解法一:只适用于单线程环境

class Singleton1
{
public:
    static Singleton1 * Intance()
    {
        if( NULL == instance )
            instance = new Singleton1();
        return instance;
    }    

private:
    Singleton1(){}
    ~Singleton1(){}

    static Singleton1 * instance;
};
Singleton1 * Singleton1::instance = NULL;

不好的解法二:可用于多线程但效率不高

class Singleton2
{
public:
    static Singleton2 * Instance()
    {
        pthread_mutex_lock( &mutex );
        if( NULL == instance )
            instance = new Singleton2();
        pthread_mutex_unlock( &mutex );

        return instance;
    }

private:
    Singleton2(){ pthread_mutex_init( &mutex, NULL ); }
    ~Singleton2(){}

    static pthread_mutex_t mutex;
    static Singleton2 * instance;
}
Singleton2 * Singleton2::instance = NULL;
pthread_mutex_t Singleton2::mutex;

可行的解法:加同步锁前后两次判断实例是否已存在

class Singleton3
{
public:
    static Singleton3 * Instance()
    {
        if( NULL == instance )
        {
            pthread_mutex_lock( &mutex );
            if( NULL == instance )
                instance = new Singleton3();
            pthread_mutex_unlock( &mutex );
        }
        return instance;
    }

private:

    Singleton3(){ pthread_mutex_init( &mutex, NULL ); }
    ~Singleton3(){}

    static pthread_mutex_t mutex;
    static Singleton3 * instance;
};
pthread_mutex_t Singleton3::mutex;
Singleton3 * Singleton3::instance = NULL;

推荐的解法一:利用静态成员初始化

class Singleton4
{
public:
    static Singleton4 * Instance() { return instance; }

private:
    Singleton4(){}
    ~Singleton4(){}

    static Singleton4 * instance;
};
Singleton4 * Singleton4::instance = new Singleton4();

推荐的解法二:按需创建实例

猜你喜欢

转载自blog.csdn.net/u013393704/article/details/81134281