创建型之单例设计模式

1. 单例设计模式的概念

        单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

2. 单例设计模式的思路

        1.即然外部不可以定义对象,也就是说是不可以从外部调到类的构造函数,所以就必须把构造函数私有 化, 但是私有化带来的问题是,在外部一个对象也定义不出来了。 所以必须在类内定义一个公开的接口,返回本类对象的指针。

         2.即使用public权限下定义一函数,返回出本类对象的指针。 但是,如果这个函数是一个普通函数的话,那么他还是依赖于类对象的调用才可以,这又与只产生一 个单例相矛盾了。 所以必须,把这个函数升级为静态函数。

        3.把这个函数升级为静态函数。 但是,升级为静态函数之后呢?函数就没有this指针,无法调取类中属性,所以也要把类中这个属性升 级为静态属性。

        4.把类中的本类的指针,升级为静态属性。

3. 单例设计模式的分类

3.1 饿汉式

3.1.1 饿汉式的优缺点

        优点:对象提前创建好,使用时无需等待,效率比较高

        缺点:对象提前创建,所以占用一定的内存,内存占用大

3.1.2 饿汉式的实现

#include <iotsream>
using namespace std;

class Singleton
{
    private:
    static Singleton *singleton;
    Singleton()
    {
        cout<<"这是一个无参构造"<<endl;
    }
    
    ~Singleton()
    {
        cout<<"这是析构"<<endl;
    }
    public:
    static Singleton* getInstance()
    {
        return singleton;
    }
};

Singleton* Singleton::singleton = new Singleton;

int main()
{
    Singleton *s1=Singleton::getinstence();
    s1->show_info();
    Singleton *s2=Singleton::getinstence();
    s2->show_info();
    Singleton *s3=Singleton::getinstence();
    s3->show_info();
 
    return 0;
}

        result :     

3.2 懒汉式设计模式

3.2.1 优缺点

        优点:使用对象时,对象才创建,所以不会提前占用内存,内存占用小

        缺点:如果两个线程同时判断singleton为空,那么它们都会去实例化一个Singleton对象,这就变成双例了。所以,我们要解决的是线程安全问题。 所以我们可以加上一个智能锁来解决这个问题lock_guard<mutex> lock(mtx);

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

class Singleton
{
    private:
    static Singleton* singleton;
    Singleton()
    {
        cout<<"这是一个无参构造"<<endl;
    }
 
    ~Singleton()
    {
        cout<<"这是析构"<<endl;
    }

    public:
    
    static Singleton* getInstance()
    {
        lock_guard<mutex> lock(mtx);
        if (singleton == nullptr)
        {
            singleton = new Singleton;
        }
        return singleton;
    }
    void show_info()
    {
        cout<<this<<endl;
    }
 
    static void destroy()
    {
        if(singleton!=nullptr)
        {
            delete singleton;
        }
    }
}

Singleton* Singleton::singleton=nullptr;
 
int main()
{
 
    Singleton *s1=Singleton::get_instence();
    s1->show_info();
    Singleton *s2=Singleton::get_instence();
    s2->show_info();
    Singleton *s3=Singleton::get_instence();
    s3->show_info();
 
    Singleton::destroy();
    return 0;
}

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林家小院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值