单例模式(懒汉&饿汉)

单例模式

单例模式是一种创建型的设计模式,使用单例模式进行设计的类在程序中只有一个实例,并且在程序的任何地方都可以调用到,这个类称为单例类。

单例模式又分为懒汉模式和饿汉模式

饿汉模式

饿汉模式是指在类加载的时候就创建对象,直接将对象实例化完毕,资源申请完毕,在使用的时候可以直接使用

优点:效率高,资源使用的时候可以直接使用

缺点:程序初始化满,资源占用多

代码:

#include<iostream>
using namespace std;

//饿汉模式
class Signleton
{
private:
    int _data;
private:
    static Signleton _eton;
    Signleton()                //构造函数私有化,目的是该类只能实例化一个对象
    {
        _data = 10;
    }    
public:
    static Signleton* Getinstance()
    {
        return &_eton;    //返回对象的地址
    }
    int GetData()
    {
        return _data;
    }
};
Signleton Signleton::_eton;
int main()
{
    Signleton* p = Signleton::Getinstance();   //用指针访问对象
    cout << p->GetData() << endl;
    return 0;
}

懒汉模式

懒汉模式是指在使用的时候才创建单例对象,即资源用到的时候在去申请

优点:程序初始化速度快,资源占用少

缺点:第一次访问对象时候速度较慢,而且存在线程安全问题

代码:

#include<iostream>
#include<mutex>
using namespace std;

//懒汉模式
class Signleton
{
private:
    int _data;
private:
    static Signleton* _eton;
    static mutex _mutex;
    Signleton()
    {
        _data = 100;
    }
public:
    static Signleton* Getistance()
    {
        if (_eton == nullptr)
        {
            //如果有多个线程同时访问,会同时判断_eton为空,就会创建多个对象,不符合
            //所以需要进行加锁操作
            _mutex.lock();
            if (_eton == nullptr)
            {
                _eton = new Signleton();
            }
            _mutex.unlock();
        }
        return _eton;
    }
    int GetData()
    {
        return _data;
    }
};
Signleton* Signleton::_eton = nullptr;
mutex Signleton::_mutex;
int main()
{
    Signleton* p = Signleton::Getistance();
    cout << p->GetData() << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值