设计模式:单例模式

一.作用

  • 不能通过构造函数构造,否则就能够实例化多个,构造函数需要私有声明
  • 保证只能产生一个实例

用处:比如程序只能有一个日志系统,只能有一个管理器等

 

二.简单式

  • 直接在类里面进行生成静态对象,但是这样可能会释放多次
  • 饿汉:需要开辟内存
复制代码
class CSingleton{

public:
    static CSingleton* GetInstance(){
        if(m_pInstance==NULL){              //m_pInstance==nullptr
            m_pInstance=new CSingleton();
        }
        return m_pInstance;
    }

private:
    CSingleton(){}
    ~CSingleton(){
        if(Singleton::local_instance!=nullptr){
            delete Singleton::local_instance;
        }
    }
    static CSingleton* m_pInstance;

};

CSingleton* CSingleton::m_pInstance=NULL;


//或者
class CSingleton{

public:
    static CSingleton* GetInstance(){
        return m_pInstance;
    }

private:
    CSingleton(){}
    ~CSingleton(){
        if(Singleton::local_instance!=nullptr){
            delete Singleton::local_instance;
        }
    }
    static CSingleton* m_pInstance;

};

 CSingleton* CSingleton::m_pInstance=new CSingleton();;
复制代码
//调用
CSingleton* p1=CSingleton::GetInstance();
CSingleton* p2=CSingleton::GetInstance();
//p1和p2地址一样

 

三.完整式

  • 在多线程下可能会new两次,所以直接返回静态对象的地址,就不用开辟内存释放
  • 懒汉:没有内存操作
复制代码
class Singleton{

private:
    static Singleton* local_instance;

    Singleton(){}
    ~Singleton(){}

public:
    static Singleton* getInstance(){
        static Singleton local;
        return &local;
    }

        //或者
        static Singleton& getInstance(){
                static Singleton local;
                return local;
        }

};
复制代码
//调用
Singleton* p1=Singleton::getInstance();
Singleton* p2=Singleton::getInstance();
//p1和p2地址一样

 

posted @   言午丶  阅读(180)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示