单例模式

单件模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。和全局变量一样方便,又没有全局变量的缺点,即不需要从一开始就创建对象,而是在需要时才创建它

 

单例模式中分为饿汉模式和懒汉模式

 

由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。

在访问量较小时,采用懒汉实现。这是以时间换空间。

 

懒汉模式就是尽可能晚的创建这个对象的实例,即在单例类第一次被引用时将自己初始化;其实C++里很多地方都是类似这样的思想,比如晚绑定,写时拷贝技术等,就是尽量使资源的利用最大化,不要让空闲的人还占着有限的资源。

 

 

#include<iostream>

#include<string>

#include<vector>

using namespace std;

 

class Singelton

{

private:

Singelton(){}

static Singelton* singel;

 

public:

static Singelton* GetInstance()

{

if(singel == NULL)

{

singel = new Singelton();

}

return singel;

}

};

 

Singelton* Singelton::singel = NULL;//静态变量外部初始化

 

int main()

{

Singelton* s1 = Singelton::GetInstance();

Singelton* s2 = Singelton::GetInstance();

if(s1 == s2)

cout<<"ok"<<endl;

else

cout<<"NO"<<endl;

return 0;

}

 

饿汉模式:即在最开始的时候,静态对象就已经创建完成;

设计方法是类中包含一个静态成员指针,该指针指向该类的一个对象,提供一个公有的静态成员方法,返回该对象指针;为了使得对象唯一,还需要将构造函数设为私有,代码如下:

#include<iostream>

#include<string>

#include<vector>

using namespace std;

 

class Singelton

{

private:

Singelton(){}

static Singelton* singel;

 

public:

static Singelton* GetInstance()

{

return singel;

}

};

 

Singelton* Singelton::singel = new Singelton;//与单例懒汉模式模式不同

 

int main()

{

Singelton* s1 = Singelton::GetInstance();

Singelton* s2 = Singelton::GetInstance();

if(s1 == s2)

cout<<"ok"<<endl;

else

cout<<"NO"<<endl;

return 0;

}

 

单例的饿汉实现是线程安全的,因为对象在使用前就已经创建出来了。

 

 

单例懒汉线程安全实现:

采用加锁机制:

#include<iostream>

using namespace std;

class Singleton

{

private:

    Singleton(){}

    static Singleton* m_Instance;

public:

    static pthread_mutex_t mutex;

    static Singleton* initance();

};

 

pthread_mutex_t Singleton::mutex = PTHREAD_MUTEX_INITIALIZER;

Singleton* Singleton::m_Instance = NULL;

Singleton* Singleton::initance()

{

    if (NULL == m_Instance)

    {

        pthread_mutex_lock(&mutex);

        if (NULL == m_Instance)

            m_Instance = new Singleton();

        pthread_mutex_unlock(&mutex);

    }

    return m_Instance;

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值