设计模式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;
}
相关推荐
wuqingshun3141597 分钟前
说说事务的隔离级别
java·spring
API快乐传递者9 分钟前
1688商品数据接口:供应链ERP数字化的核心引擎
java·大数据·运维
鱼鳞_11 分钟前
Java学习笔记_Day21
java·笔记·学习
码云数智-大飞11 分钟前
Java异常体系深度解析:驾驭Checked与Unchecked的艺术
java
fengci.14 分钟前
polar2026年春季个人挑战赛(WEB 困难部分)
java·大数据·elasticsearch
大数据新鸟16 分钟前
设计模式详解——外观模式
设计模式·外观模式
攒了一袋星辰20 分钟前
SequenceGenerator废弃序列号异步补偿机制技术实现方案
java·开发语言·数据库·mysql
amIZ AUSK29 分钟前
Spring Boot 自动配置
java·spring boot·后端
努力学习的小廉29 分钟前
Python 零基础入门——基础语法(一)
java·网络·python
AI精钢37 分钟前
Claude Certification 出现了一道“官方文档级”错题:关于 Claude Code Skills 优先级的误导
java·开发语言·工程实践·claude code·ai coding·agent skills·技术认证