单例模式(Singleton), 保证一个类仅有一个实例, 并提供一个访问它的全局访问点.
通常我们可以让一个全局变量使得一个对象被访问, 但它不能防止你实例化多个对象. 一个最好的办法就是, 让类自身负责保存它的唯一实例. 这个类可以保证没有其他实例可以被创建, 并且它提供一个访问该实例的方法.
单例模式的特点:
1. 构造函数为private
2. 有private的static 类指针
3. 有public方法 GetInstance(), 返回static 类指针
4. 有public方法DelInstance(), 释放内存
5. static 类指针的初始化在类定义之外, 一般在cpp中.
SingletonTest.h
#ifndef SINGLETONTEST_H
#define SINGLETONTEST_H
class Singleton
{
public:
static Singleton* GetInstance();
static void DeleteInstace();
private:
Singleton();
~Singleton();
static Singleton* m_pSingleton;
};
#endif
SingletonTest.cpp
#include "SingletonTest.h"
#include <iostream>
// static变量初始化, 也可以 Singleton* Singleton::m_pSingleton = new Singleton(); 然后在GetInstance()内直接返回.
Singleton* Singleton::m_pSingleton = nullptr;
Singleton* Singleton::GetInstance()
{
if (m_pSingleton == nullptr)
{
m_pSingleton = new Singleton();
std::cout << "实例被创建" << std::endl;
}
else
{
std::cout << "实例已经被创建, 不做操作" << std::endl;
}
return m_pSingleton;
}
void Singleton::DeleteInstace()
{
if (m_pSingleton != nullptr)
{
delete m_pSingleton;
m_pSingleton = nullptr;
std::cout << "实例被删除" << std::endl;
}
else
{
std::cout << "实例指针为空, 不做操作" << std::endl;
}
}
Singleton::Singleton()
{
}
Singleton::~Singleton()
{
}
main.cpp
#include "SingletonTest.h"
#include <iostream>
int main()
{
Singleton* p_SingletonA = Singleton::GetInstance();
Singleton* p_SingletonB = Singleton::GetInstance();
if (p_SingletonA == p_SingletonB)
{
std::cout << "两个实例相同!" << std::endl;
}
p_SingletonA->DeleteInstace();
p_SingletonB->DeleteInstace();
return 0;
}
输出结果: