该模式的主要目的就是确保某个类有且仅有一个实例存在。实现就是私有化构造函数,拷贝构造函数,使外界无法通过new去获取它的实例,我们自身提供一个静态的公有方法,该方法创建或者获取它本身的静态私有对象并返回。
第一种:懒汉单例模式,只有在需要使用的时候才会去实例化。
1.懒汉单例头文件
#pragma once
#include <iostream>
class Singleton
{
public:
static Singleton* getInstance();
class HuiShou
{
public:
~HuiShou()
{
if (Singleton::instance)
{
delete Singleton::instance;
Singleton::instance = nullptr;
}
}
};
private:
Singleton();
Singleton(const Singleton&);
static Singleton* myInstance; //静态变量,类内声明,类外定义进行初始化
};
2.懒汉单例源文件
#include "Singleton.h"
#include<mutex>
Singleton* Singleton::myInstance = nullptr;
mutex my_mutex;
Singleton::Singleton()
{
}
Singleton::Singleton(const Singleton&)
{
}
Singleton* Singleton::getInstance()
{
if (nullptr == myInstance)
{
unique_lock<std::mutex> urgard(my_mutex);// 如果有两个线程同时获取单例类的实例,需要加锁
if (myInstance == nullptr)
{
static HuiShou huishou;
myInstance = new Singleton();
}
}
return myInstance;
}
另一种写法:
#include <iostream>
#include <mutex>
#include <thread>
std::once_flag f_flag;
class Singleton {
private:
static Singleton* instance;
Singleton(){}
public:
static Singleton CreatInstance()//这里的函数要定义成静态函数,否则call_once的第二个参数会报错
{
instance = new Singleton;
}
static Singleton* Getinstance()
{
std::call_once(f_flag, CreatInstance);
return instance;
}
};
Singleton* Singleton::instance = nullptr;
3.主程序文件
// 懒汉单例模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "Singleton.h"
int main()
{
Singleton* pSingleton1 = Singleton::getInstance();
Singleton* pSingleton2 = Singleton::getInstance();
std::cout << &pSingleton1 << std::endl;
std::cout << &pSingleton1 << std::endl;
if (pSingleton1 == pSingleton2)
{
std::cout << "懒汉单例唯一\n";
}
system("pause");
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
第二种:饿汉单例模式,在单例类定义的时候就进行实例化。
1.饿汉单例模式头文件
#pragma once
#include <iostream>
class Singleton
{
public:
static Singleton* getInstance();
private:
Singleton();
Singleton(const Singleton&);
static Singleton* myInstance;
};
2.饿汉单例模式源文件
#include "Singleton.h"
Singleton* Singleton::myInstance = new Singleton();
Singleton::Singleton()
{
}
Singleton::Singleton(const Singleton&)
{
}
Singleton* Singleton::getInstance()
{
return myInstance;
}
3.主程序
// 饿汉单例模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include "Singleton.h"
int main()
{
Singleton* pSingleton1 = Singleton::getInstance();
Singleton* pSingleton2 = Singleton::getInstance();
std::cout << &pSingleton1 << std::endl;
std::cout << &pSingleton1 << std::endl;
if (pSingleton1 == pSingleton2)
{
std::cout << "懒汉单例唯一\n";
}
system("pause");
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件