C++设计模式之单例模式
应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
懒汉单例模式
Singleton.h
/*说明:
*1.保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口
*2.为了避免在其他函数 实例化 需要将构造函数私有化
*3.由于无法实例化需要通过类名静态调用。使用关键词static修饰创建对象接口getInstance;
*懒汉式单例模式*/
#pragma once
class Singleton
{
public:
static Singleton* getInstance();//静态方法属于类,所以只能调用静态属性
void doWork();
private:
Singleton();
private:
static Singleton* m_singleton;
};
Singleton.cpp
#include "Singleton.h"
#include <iostream>
#include <mutex>
using namespace std;
Singleton* Singleton::m_singleton = nullptr;//类外初始化
std::mutex mux;
Singleton* Singleton::getInstance()
{
if (m_singleton == nullptr)
{
mux.lock();//防止懒汉单例模式多线程同时访问产生竞争
m_singleton= new Singleton;//这个时候会调用私有构造,
mux.unlock();
}
return m_singleton;
}
Singleton::Singleton()
{
cout << "私有构造完成类内初始化" << endl;;
}
饥饿单例模式
Singleton.h
/*说明:
*1.适用工程只需要一个对象,在同一个对象进行操作
*2.为了避免在其他函数 实例化 需要将构造函数私有化
*3.由于无法实例化需要通过类名静态调用。使用关键词static修饰创建对象接口getInstance;
*懒汉式单例模式*/
#pragma once
class Singleton
{
public:
static Singleton* getInstance();//静态方法属于类,所以只能调用静态属性
private:
Singleton();
private:
static Singleton* m_singleton;
};
Singleton.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::m_singleton = new Singleton;//类外初始化
Singleton* Singleton::getInstance()
{
return m_singleton;
}
Singleton::Singleton()
{
cout << "私有构造完成类内初始化" << endl;;
}
main.cpp
#include <iostream>
#include "Singleton.h"
int main()
{
Singleton::getInstance()->doWork();//无需new对象即可对类内public成员方法进行访问
}