设计模式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;
}
相关推荐
benbenAItalk2 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl2 小时前
Java学习二 基本语法2, 算术运算符
java·学习
niucloud-admin3 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885723 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户3 小时前
Java锁
java·开发语言
shehuiyuelaiyuehao5 小时前
1计算机是如何工作的
java·计算机网络
letisgo55 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周5 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三8446 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
暮雨哀尘6 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言