用户登录
用户注册

分享至

【C++设计模式】 单例

  • 作者: 孤独是久治不愈的绝症丶
  • 来源: 51数据库
  • 2021-09-21

定义

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();
软件
前端设计
程序设计
Java相关