C++实现面试常见设计模式(未完待续)

单例模式

1.懒汉模式

GetInstance()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有GetInstance()之后的调用都返回相同实例的指针。

class CSingleton{
public:
    static CSingleton* GetInstance(){
        if (m_pInstance == nullptr)
            m_pInstance = new CSingleton();
        return m_pInstance;
    }
    ~CSingleton(){};
private:
    CSingleton(){};
    Singleton(Singleton)=delete;//?????
    Singleton operator=(const Singleton)=delete;//?????
    static CSingleton* m_pInstance;
}
Singleton* Singleton::m_instance_ptr = nullptr;

线程安全的懒汉模式:

class Singleton{
public:
    typedef std::shared_ptr<Singleton> Ptr;
    ~Singleton(){
        std::cout&lt;&lt;&quot;destructor called!&quot;&lt;&lt;std::endl;
    }
    Singleton(Singleton&amp;)=delete;
    Singleton&amp; operator=(const Singleton&amp;)=delete;
    static Ptr get_instance(){

        // double checked lock
        if(m_instance_ptr==nullptr){
            std::lock_guard<std::mutex> lk(m_mutex);
            if(m_instance_ptr == nullptr){
              m_instance_ptr = std::shared_ptr<Singleton>(new Singleton);
            }
        }
        return m_instance_ptr;
    }


private:
    Singleton(){
        std::cout&lt;&lt;&quot;constructor called!&quot;&lt;&lt;std::endl;
    }
    static Ptr m_instance_ptr;
    static std::mutex m_mutex;
};

2.饿汉模式

class CSingleton{
private:
    CSingleton(){}
pubic:
    static CSingleton* GetInstance(){
        static CSingleton* instance;
        return instance;
    }
}

多线程模式下会出问题的,线程安全的饿汉模式如下:

class CSingleton  
{  
private:  
    static CSingleton* m_instance;  
    CSingleton(){}  
public:  
    static CSingleton* getInstance();  
};  

CSingleton* CSingleton::getInstance()  
{  
    if(NULL == m_instance)  
    {  
        Lock();//借用其它类来实现&#
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值