美文网首页
单例模式C++

单例模式C++

作者: 涵仔睡觉 | 来源:发表于2018-05-10 15:00 被阅读0次

单例模式,就说保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式结构图

image

单例模式基本代码

class Singleton {
private:
    static Singleton* instance;
    Singleton() {} // 将构造函数设为私有,禁止外界调用
public:
    static Singleton* GetInstance() {  // 获取实例的唯一全局访问点
        if (instance == NULL) {
            instance  = new Singleton();
        } 
        return instance;
    }
};

懒汉式和饿汉式

  • 饿汉式单例类:类被加载时就将自己实例化,称之为饿汉式实例类。因为类一加载就实例化对象,会提前占用系统资源,但不会有多线程的安全性问题。
  • 懒汉式单例类:在第一次被引用时才将自己实例化,称之为懒汉式实例类。但其面临多线程安全性问题,需要双重锁定才可以保证安全。

懒汉式

#include <iostream>
using namespace std;

template<class T>
class Singleton{
private:
    static T* instance;
    Singleton() {}
public:
    static T* GetInstance() {
        return instance;
    }
};

template<class T>
T* Singleton<T>::instance = new T(2);   // 类刚加载时就初始化

int main() {
    int* p1 = Singleton<int>::GetInstance();
    cout << *p1 << endl;   // 2

    int* p2 = Singleton<int>::GetInstance();
    cout << *p2 << endl;   // 2

    return 0;
}

饿汉式

在多线程环境中,如果多个线程同时访问Singleton类,调用GetInstane()方法,会导致创建多个实例。这样可以通过加锁解决:

#include <iostream>
#include "pthread.h"
using namespace std;

template<class T>
class Singleton{
private:
    static T* instance;
    Singleton() {}
    static pthread_mutex_t mutex;
public:
    static T* GetInstance() {
        pthread_mutex_lock(&mutex);
        if (instance == NULL) {
            instance = new T(3);
        }
        pthread_mutex_unlock(&mutex);
        return instance;
    }
};

template<class T>
pthread_mutex_t Singleton<T>::mutex = PTHREAD_MUTEX_INITIALIZER;

template<class T>
T* Singleton<T>::instance = NULL;

int main() {
    int* p1 = Singleton<int>::GetInstance();
    cout << *p1 << endl;     // 3

    int* p2 = Singleton<int>::GetInstance();
    cout << *p2 << endl;     // 3

    return 0;
}
双重锁定

以上方法每次调用GetInstance方法都需要调用pthread_mutex_lock(&mutex),这样会影响性能。可以通过双重锁定来解决:

#include <iostream>
#include "pthread.h"
using namespace std;

template<class T>
class Singleton{
private:
    static T* instance;
    Singleton() {}
    static pthread_mutex_t mutex;
public:
    static T* GetInstance() {
        if (instance == NULL) {
            pthread_mutex_lock(&mutex);
            if (instance == NULL) {
                instance = new T(3);
            }
            pthread_mutex_unlock(&mutex);
        }
        return instance;
    }
};

template<class T>
pthread_mutex_t Singleton<T>::mutex = PTHREAD_MUTEX_INITIALIZER;

template<class T>
T* Singleton<T>::instance = NULL;

int main() {
    int* p1 = Singleton<int>::GetInstance();
    cout << *p1 << endl;     // 3

    int* p2 = Singleton<int>::GetInstance();
    cout << *p2 << endl;     // 3

    return 0;
}

应用场景

优点:

  1. 保证唯一的实例;
  2. 可以严格控制客户怎样访问实例以及何时访问,即对唯一实例的受控访问。

相关文章

  • 学而时习之单例模式

    本文主要说明单例模式的概念,应用,以及C++实现。 I、上帝视角看单例模式 1.1 单例模式特点 单例模式需要满足...

  • 单例模式

    单例模式及C++实现代码单例模式4种实现详解 c++11改进我们的模式之改进单例模式 单例模式(Singleton...

  • Singleton 单例模式

    搬运自大神博客单例模式(Singleton)及其C++实现 单例模式,在GOF的《设计模式:可复用面向对象软件的基...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • C++懒汉式单例模式遇到多线程

    C++懒汉式单例模式遇到多线程 单例模式是一个创建型设计模式, 就是保证在整个程序运行中仅存在该类的一个实例, 比...

  • 单例模式C++

    单例模式,就说保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式结构图 单例模式基本代码 懒汉式和饿...

  • C++单例模式

    所谓单例模式,就是只允许全局有一个此类生成的对象。在C++中有几种实现,下面一一列举。 1. 最初模式 需要解释的...

  • c++ 单例模式

    链接 为什么要用double checking 之前在使用Double Check Locking 模式时,发现自...

  • C++单例模式

    一、两个基本原则 把构造函数、拷贝构造函数、赋值操作符函数设置为私有的,从而阻止用户去实例化一个对象; 提供一个公...

网友评论

      本文标题:单例模式C++

      本文链接:https://www.haomeiwen.com/subject/fwgzrftx.html