单例模式

65 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

单例就是说他要求一个类只能有一个对象,所有对象对它的依赖相同,在使用的时候不需要每次都要重新声明,使用起来更为便捷。他还可以减少内存的开支,减少系统新能德开支,他是在启动的时候就直接产生的一个对象,一直使用到结束。

实现要点: 将析构函数设置为非public的权限

使用一个类静态成员 保存唯一的实例

实现一个public的静态方法 用于获取唯一的对象实例

 

 懒汉式与饿汉式的区别: 懒汉式与饿汉式可由字面意思得知,懒汉式就是死到临头才去实例化类,而饿汉式则是怕饿着,提前存好,会在最开始的时候就对他进行实例化。两种方式按照需要来使用。

懒汉:在访问量较小时,采用懒汉实现。这是以时间换空间。 饿汉:由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。 在安全性上,饿汉式更为安全。

懒汉式

Namespace dan{

 

class CSingleton   

{   

public:   

    static CSingleton * GetInstance()   

    {   

        If(instance == nullptr )

                  Instance = new CSingleton;

        return instance;   

}

Private:

CSingleton() {} 

static CSingleton*  instance;

};

}

1.懒汉式不会进行初始化 用时间换空间

2.不能保证线程安全  可能在调用instance是创建出多个单例

3.可能存在内存泄漏

改进:

namespace dan

{

template //模板 将T用模板的形式传进去

class CSingleton

{

public:

       static T* GetInstance()

       {

         If(instance == nullptr )

           Instance = new T();

           return instance.get();

       }

       Singleton(void){}

 private:

      Singleton(const Singleton&) =delete;//{} 拷贝构造和赋值重载删除掉

       Singleton& operator= (const Singleton&) =delete;//{}

       static T* instance;

};

 

template

T* Singleton:: instance =  nullptr;//类外初始化

优化:

static std::shared_ptr GetInstance()

static std::shared_ptr instance;// 使用智能指针 解决析构问题  shared_ptr 可以在生命周期结束之后自动释放

 

饿汉式

 

class CSingleton   

{   

private:   

    CSingleton() {}        

public:   

    static CSingleton * GetInstance()   

    {   

        static CSingleton instance;    

        return &instance;   

    }

};

 

设置析构函数为私有  只能释放堆区内存