设计模式之单例模式

设计模式之单例模式

Singleton(单例)模式是最常见的,最容易实现,最应该掌握的设计模式。
单例模式解决的问题非常常见:如何去创建唯一的一个类对象(变量)?在C++语言中,通常维护一个静态成员变量来记录这一个唯一的对象,再通过一个静态接口instance来获取这一个实例。
结构图如下:
这里写图片描述
完整代码如下:

//Singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#include <iostream>
using namespace std;
class Singleton {
public:
    static Singleton* Instance() {
        if(_instance == nullptr) {
            return new Singleton();
        }
        return _instance;
    }
protected:
    Singleton() {
        cout << "Singleton..." << endl;
    }
private:
    static Singleton* _instance;
};
Singleton* Singleton::_instance = 0;
#endif // SINGLETON_H

//main.cpp
#include "Singleton.h"
using namespace std;
int main() {
    Singleton *sgn = Singleton::Instance();
    return 0;
}

Singleton不能被初始化,因此构造函数被声明为protected或者private。
上述是线程不安全的,两个线程同时首次调用Instance()方法,两个线程会同时构造一个`_instance实例,这是错误的。
懒汉模式:第一次用到类实例时才会类实例化
饿汉模式:在定义单例模式时就进行实例化
懒汉模式为了线程安全必须加锁:

Singleton* Singleton::Instance() {
    if(_instance == nullptr) {
        pthread_mutex_lock(&mutex);
        if(_instance == nullptr) {
            return new Singleton();
        }
        pthread_mutex_lock(&mutex);
    }
    return _instance;
}

饿汉模式:在定义时实例化(线程安全的)

Singleton* Singleton::_instance = new Singleton();
Singleton* Singleton::Instance() {
    return _instance;
}

主要参考自《设计模式精解-GoF 23种设计模式解析附C++实现源码》作者:K_Eckel, 作者EMAIL:frwei@whu.edu.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值