zoukankan      html  css  js  c++  java
  • 设计模式:单例模式

    一.作用

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

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

    二.简单式

    • 直接在类里面进行生成静态对象,但是这样可能会释放多次
    • 饿汉:需要开辟内存
    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地址一样
  • 相关阅读:
    min_25筛入门
    [湖南集训]更为厉害/谈笑风生
    [ARC060D] 最良表現
    [CQOI2007]矩形
    [SCOI2009]粉刷匠
    PAT乙级1030
    PAT乙级1028
    PAT乙级1029
    PAT乙级1026
    PAT乙级1027
  • 原文地址:https://www.cnblogs.com/k5bg/p/11063339.html
Copyright © 2011-2022 走看看