C++单例模式

#include <iostream>
#include <conio.h>
using namespace std;

/*******************************************************************************

//   Mayer's Singleton

class Singleton{
public:
    // 注意返回的是引用。
    static Singleton& getInstance(){
        static Singleton m_instance;  //局部静态变量
        return m_instance;
    }
private:
    Singleton(); //私有构造函数,不允许使用者自己生成对象
    ~Singleton();  
    Singleton(const Singleton&); 
    Singleton(const Singleton& other);
};

*******************************************************************************/

/*******************************************************************************

//Lazy Singleton

class Singleton{
private:
    Singleton();
    static Singleton* instance;
public:
    static Singleton* getinstance(){
        if(instance == NULL)
            instance = new Singleton();
        return instance;
    }
};
Singleton* Singleton::instance = NULL;

*******************************************************************************/

/*******************************************************************************

//pthread_once
//在linux中,pthread_once()函数可以保证某个函数只执行一次。

//声明: int pthread_once(pthread_once_t once_control, void (init_routine) (void));

//功能: 本函数使用初值为PTHREAD_ONCE_INIT的once_control
//变量保证init_routine()函数在本进程执行序列中仅执行一次。 

class Singleton{
public:
    static Singleton* getInstance(){
        // init函数只会执行一次
        pthread_once(&ponce_, &Singleton::init);
        return m_instance;
    }
private:
    Singleton(); //私有构造函数,不允许使用者自己生成对象
    Singleton(const Singleton& other);
    //要写成静态方法的原因:类成员函数隐含传递this指针(第一个参数)
    static void init() {
        m_instance = new Singleton();
      }
    static pthread_once_t ponce_;
    static Singleton* m_instance; //静态成员变量 
};
pthread_once_t Singleton::ponce_ = PTHREAD_ONCE_INIT;
Singleton* Singleton::m_instance=nullptr; //静态成员需要先初始化

*******************************************************************************/

// Eager Singleton
class Singleon
{
private:
	Singleon()
	{
		cout << "Singleon()" << endl;
	}
	static Singleon* instance;
public:
	static Singleon* GetSingleon()
	{
		return instance;
	}
	static Singleon* Destroy()
	{
		delete instance;
		instance = NULL;
	}
};
Singleon* Singleon::instance = new Singleon();


int main()
{
	Singleon* sl1 = Singleon::GetSingleon();
	Singleon* sl2 = Singleon::GetSingleon();
	Singleon* sl3 = Singleon::GetSingleon();
	cout << sl1 << endl;
	cout << sl2 << endl;
	cout << sl2 << endl;
	getch();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值