单例模式是面试官非常爱考的一种设计模式。当我第一次接触的时候,感觉这是个什么鬼?不过自己还是坚持下来,下面是我关于这个模式的一些思路和想法。
1.单例模式的概念:
- 通俗点来说,一个类只能创建一个对象即为单例模式。
在很多时候,为了更安全,可靠的访问某个服务器的话,就必须要设计出一个独立的对象去访问它,而其他对象则不能够进行访问。
单例模式的实现主要有两种方式:饿汉模式和懒汉模式。
2.饿汉模式
不管你用或者不用,程序启动的时候就会创建唯一的一个对象。
如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。
class Singleton
{
public:
{
static Singleton* GetInstance()
{
return &instance;
}
}
private:
{
Singleton(){};
Singleton(Singleton conat&)
{}
Singleton& operator=(singleton const&)
{}
static Singleton instance;
}
};
Singleton Singleton::instance;
3.懒汉模式
如果单例对象构造时或者占用很大的资源,比如加载插件,初始化网络连接,读取文件等,又或者该对象程序运行时不会用到。那么如果在程序一开始就进行初始化的话,就会导致启动的时候非常的缓慢。这种情况用懒汉模式更好。(延迟加载)
#include<iostream>
#include<mutex>
class Singleton
{
public:
static Singleton* GetInstance()
{
if(nullptr == instance)
{
// 注意这里一定要使用Double-Check的方式加锁,才能保证效率和线程安全
m_mtx.lock();
if(nullptr == instance)
{
instance == new Singleton();
}
m_mtx.unlock();
}
return instance;
}
private:
Singleton(){};
Singleton(Singleton const&)
{}
Singleton& operator=(Singleton const&)
{}
static Singleton* m_instance;
static mutex m_mtx;
};
Singleton* Singleton::m_pInstance = nullptr;
mutex Singleton::m_mtx;