单例模式(懒汉模式/饿汉模式)

发布于:2025-04-02 ⋅ 阅读:(23) ⋅ 点赞:(0)

相关概念参考:【C++】C++ 单例模式总结(5种单例实现方法)_单例模式c++实现-CSDN博客

#include<iostream>

class LazySingle{
public:
    static LazySingle& getInstance(){
        static LazySingle instance;
        return instance;
    }

    void hello(){
        std::cout<<"Congratulations"<<std::endl;
    }

private:
    LazySingle(){};
};
class LazySinglePtr{
    public:
        static LazySinglePtr* getInstance(){
            static LazySinglePtr instance;
            return &instance;
        }
    
        void hello(){
            std::cout<<"Congratulations"<<std::endl;
        }
    
    private:
        LazySinglePtr(){};
};

class HungrySingle{
public:
    static HungrySingle& getInstance(){
        return instance_;
    }

private:
    static HungrySingle instance_;
    HungrySingle(){};
};

HungrySingle  HungrySingle::instance_;

int main(){
    std::cout<<"懒汉引用模式:"<<std::endl;
    auto& lazy1=LazySingle::getInstance();
    LazySingle& lazy2=LazySingle::getInstance();
    std::cout<<" lzay1="<<&lazy1<<" lzay2="<<&lazy2<<" instance="<<&LazySingle::getInstance()<<std::endl;
    lazy1.hello();

    std::cout<<"懒汉指针模式:"<<std::endl;
    auto lazyptr1=LazySinglePtr::getInstance();
    LazySinglePtr* lazyptr2=LazySinglePtr::getInstance();
    std::cout<<" lzay1="<<lazyptr1<<" lzay2="<<lazyptr2<<" instance="<<LazySinglePtr::getInstance()<<std::endl;
    lazyptr1->hello();
    
    std::cout<<"饿汉模式:"<<std::endl;
    HungrySingle& hungry1=HungrySingle::getInstance();
    HungrySingle& hungry2=HungrySingle::getInstance();
    std::cout<<" hungry1="<<&hungry1<<" hungry2="<<&hungry2<<" instance="<<&HungrySingle::getInstance()<<std::endl;

    return 0;
    
}

输出:

懒汉引用模式:
 lzay1=0x7ff61a279e90 lzay2=0x7ff61a279e90 instance=0x7ff61a279e90
Congratulations
懒汉指针模式:
 lzay1=0x7ff61a279ee0 lzay2=0x7ff61a279ee0 instance=0x7ff61a279ee0
Congratulations
饿汉模式:
 hungry1=0x7ff61a2aa030 hungry2=0x7ff61a2aa030 instance=0x7ff61a2aa030