当前位置: 萬仟网 > 移动技术>移动开发>IOS > 【C++设计模式】 单例

【C++设计模式】 单例

2021年01月05日  | 萬仟网移动技术  | 我要评论
定义GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。类图步骤构造函数私有化提供全局静态方法类内定制指针,指向本类;懒汉式单例在调用getInstance()方法时才创建对象,饿汉式会创建一个全局变量,调用getInstance()方法返回这个全局变量;懒汉式代码:#include <iostream>#include <mutex>using namespace std;// 临界区, 用于解决多线程

定义

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();

本文地址:https://blog.csdn.net/qq_43288972/article/details/112252913

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
Copyright © 2017-2021  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com