【C++设计模式】 单例

定义

GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

类图

单例类图

步骤

  1. 构造函数私有化
  2. 提供全局静态方法
  3. 类内定制指针,指向本类;懒汉式单例在调用getInstance()方法时才创建对象,饿汉式会创建一个全局变量,调用getInstance()方法返回这个全局变量;

懒汉式

代码:

#include <iostream>
#include <mutex>
using namespace std;


// 临界区, 用于解决多线程问题
static mutex cs;

class Singleton {
private:
    // 1. 构造函数私有化
    Singleton() {
    }

public:
    // 2. 提供静态全局方法获取对象
    static Singleton *getInstance() {
        if (pInstance == nullptr) { // 临界区需要二次判断,避免重复创建对象
            cs.lock(); // 只有当pInstance等于null时,才开始使用枷锁机制 二次检查
            if (pInstance == nullptr) {
                pInstance = new Singleton();
            }
            cs.unlock();
        }
        return pInstance;
    }

    // 4. 提供静态方法,用于释放内存
    static void FreeInstance() {
        if (pInstance != nullptr) {
            delete pInstance;
            pInstance = nullptr;
        }
    }

private:
    // 3.1 静态指针,指向本类对象; 类内声明,类外初始化;
    static Singleton *pInstance;
};

// 3.2 静态指针, 类外初始化;
Singleton *Singleton::pInstance = nullptr;

调用

Singleton *p = Singleton::getInstance();

饿汉式

#include <iostream>
#include <mutex>
using namespace std;


// 临界区, 用于解决多线程问题
static mutex cs;

class Singleton {
private:
    // 1. 构造函数私有化
    Singleton() {
        pInstance = nullptr;
    }
public:
    // 2. 提供静态全局方法获取对象
    static Singleton *getInstance() {
        // 饿汉式单例
        return pInstance;
    }

    // 4. 提供静态方法,用于释放内存
    static void FreeInstance() {
        if (pInstance != nullptr) {
            delete pInstance;
            pInstance = nullptr;
        }
    }
private:
    // 3.1 静态指针,指向本类对象; 类内声明,类外初始化;
    static Singleton *pInstance;
};

// 3.2 静态指针, 类外初始化;
Singleton *Singleton::pInstance = new Singleton;  // 相当于全局变量

调用

Singleton *p = Singleton::getInstance();

单例模式升级版本

挖坑,之后再填
上面的两种单例模式依然不是完美的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值