欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

【C++设计模式】 单例

程序员文章站 2022-06-19 15:13:55
定义GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。类图步骤构造函数私有化提供全局静态方法类内定制指针,指向本类;懒汉式单例在调用getInstance()方法时才创建对象,饿汉式会创建一个全局变量,调用getInstance()方法返回这个全局变量;懒汉式代码:#include #include using namespace std;// 临界区, 用于解决多线程...

定义

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

类图

【C++设计模式】 单例

步骤

  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