什么是单例设计模式
单例模式是一种创建唯一对象的设计模式,保证一个类只有一个实例对象。
单例设计模式往往可以满足以下需求:
- 需要频繁实例化对象然后销毁
- 需要创建一个方便数据传输(通信)的环境
- 只需要一个实例,并且不允许存在多个实例
- 实例化对象资源消耗过多,反复创建成本高
实现步骤
- 构造函数私有化,使得无法在外部构造对象
- 类中定义一个静态指针,它指向一个对象,这个对象只创建一次
- 提供一个静态接口,其返回上面的静态指针,也就是唯一对象
简单实现代码即解析
第一种实现方式
头文件
#pragma once
#include<iostream>
using namespace std;
class Single
{
public:
//公有全局接口
static Single* GetInstance();
//唯一实例指针,当然可以放在private下更安全些,第二种实现就放在了private下。
static Single* pintance;
//测试接口
void test();
private:
//构造函数私有化
Single();
};
实现文件
#include "Single.h"
//上来先初始化指针
Single* Single::pintance = nullptr;
Single::Single() {
cout << "Creating Single Instance" << endl;
//下面这行初始化与否都无所谓,因为必然初始化过了
pintance = nullptr;
}
Single* Single::GetInstance(){
if (pintance == nullptr) {
//在这里实例化唯一对象
pintance = new Single;
}
return pintance;
}
void Single::test(){
cout << "success!" << endl;
}
源文件调用形式
#include"Single.h"
using namespace std;
int main() {
Single* p1 = Single::GetInstance();
Single* p2 = Single::GetInstance();
//两者地址应当相同,因为只存在一个实例。
//并且只调用了一次构造函数
cout << hex << p1 << "\n" << hex << p2 << endl;
p1->test();
return 0;
}
结果如下:
第二种实现方式
头文件
#pragma once
#include<iostream>
using namespace std;
class Single2
{
public:
//公有全局接口
static Single2* GetInstance();
//测试接口
void test2();
private:
//构造函数私有化
Single2();
//唯一实例指针
static Single2* pintance;
};
实现文件
#include "Single2.h"
//这里与第一种不同之处在于,无论是否使用对象,对象都会被创建
//比如游戏资源加载,这些必不可少的资源在启动时就自己加载省却调用
//怕麻烦的推荐使用这种方法,毕竟很少有人会包含某个类,但不去使用
Single2* Single2::pintance = new Single2;
Single2* Single2::GetInstance(){
return pintance;
}
void Single2::test2()
{
cout << "success!" << endl;
}
Single2::Single2() { }
源文件调用形式
#include"Single2.h"
using namespace std;
int main() {
Single2* p1 = Single2::GetInstance();
Single2* p2 = Single2::GetInstance();
//两者地址应当相同,因为只存在一个实例。
//并且只调用了一次构造函数
cout << hex << p1 << "\n" << hex << p2 << endl;
p1->test2();
return 0;
}
如果如下: