设计模式1、单例模式 Singleton

解释说明:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例

要点如下
有且仅有一个实例
必须自行创建自己的唯一实例
必须给所有其他对象提供这一实例
具体实现要点如下
提供一个 private 构造函数(防止外部调用而构造类的实例)
提供一个该类的 static private 对象
提供一个 static public 函数,用于创建或获取其本身的静态私有对象(例如:GetInstance())
除此之外,还有一些关键点(需要多家注意,很容易忽视):
线程安全(双检锁 - DCL,即:double-checked locking)
资源释放

cpp 复制代码
// 单例 - 懒汉式/饿汉式公用
class Singleton
{
public:
       static Singleton* GetInstance();
private:
       Singleton() {}  // 构造函数(被保护)
private:
       static Singleton* m_pSingleton;  // 指向单例对象的指针
       // GC 机制
       class GC
       {
       public:
              ~GC()
              {
                     // 可以在这里销毁所有的资源,例如:db 连接、文件句柄等
                     if (m_pSingleton != NULL) {
                           cout << "Here destroy the m_pSingleton..." << endl;
                           delete m_pSingleton;
                           m_pSingleton = NULL;
                     }
              }
              static GC gc;  // 用于释放单例
       };
};

// 单例 - 懒汉式(双检锁 DCL 机制)
Singleton* Singleton::m_pSingleton = NULL;
Singleton* Singleton::GetInstance()
{
       if (m_pSingleton == NULL)
              m_pSingleton = new Singleton();
       return m_pSingleton;
}

#include "singleton.h"
#include <iostream>
using namespace std;
Singleton::GC Singleton::GC::gc; // 重要
int main()
{
       Singleton::GetInstance();
       return 0;
}
相关推荐
浮游本尊7 分钟前
Java学习第22天 - 云原生与容器化
java
渣哥2 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧2 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机3 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解3 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机4 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆6 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学6 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole6 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端