问题:
有一种情景,单例实例化对象需要在网络通信的通道建立好之后。
如果使用饿汉模式,程序开始执行,上来先实例化一个,也不管后面用不用得到。
饿汉模式
#ifndef _SINGLETON_
#define _SINGLETON_
class Singleton1 {
public:
static Singleton1* getInstance() { return &m_instance; }
private:
Singleton1() {}
Singleton1(Singleton const&) = delete;
Singleton1& operator=(Singleton1 const&) = delete;
private:
static Singleton1 m_instance;
};
#endif
饿汉模式实现
Singleton Singleton::m_instance;
可能还会在单例代码里面添加其他的业务代码,这就会导致也许在通道还没建立之前就实例化一个单例对象,导致业务出现BUG。因此需要使用下面的懒汉模式的单例。
懒汉模式
#ifndef _SINGLETON_
#define _SINGLETON_
#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton* getInstance(); // 获取实例
unsigned short getPort() const; // 测试
private:
Singleton() : port(0){} // 私有构造禁止外界使用
Singleton (Singleton const&) = delete; // 禁止外界拷贝
Singleton& operator=(Singleton const&) = delete; // 禁止外界赋值构造
public:
class GCCollector {
public:
~GCCollector();
};
private:
static GCCollector collector;
static Singleton* m_instance;
unsigned short port;
static std::mutex m;
};
懒汉模式实现
#include "Singleton.h"
Singleton* Singleton::getInstance(){
if(!m_instance) {
m.lock();
if(!m_instance)
m_instance = new Singleton();
m.unlock();
}
return m_instance;
}
unsigned short Singleton::getPort() const {
return port;
}
Singleton::GCCollector::~GCCollector() {
if(m_instance) {
delete m_instance;
}
}
Singleton* Singleton::m_instance = NULL;
Singleton::GCCollector collector;
Singleton1 Singleton1::m_instance;
#include "Singleton.h"
int main(int argc, char * argv[]) {
std::cout << Singleton::getInstance() << std::endl;;
std::cout << Singleton1::getInstance() << std::endl;
return 0;
}
随便记录~~