工作生活

设计模式01 - 单例模式

2019-07-02  本文已影响0人  第八天的蝉啊
1. 定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式,特点如下
2. 懒汉式单例:类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例
//CSingleton.h
class CSingleton  
{  
public:  
    static CSingleton* GetInstance()  
    {
        if ( m_pInstance == NULL )
            m_pInstance = new CSingleton(); 
        return m_pInstance;  
    }  

protected:
    CSingleton() { }
    ~CSingleton() { }

private:  
    static CSingleton* m_pInstance;  
};

两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给m_pInstance

//CSingleton.h
class CSingleton  
{
public:
    static pthread_mutex_t mutex;
    static CSingleton* GetInstance();

protected:
    CSingleton()
    {
        pthread_mutex_init(&mutex);
    }

private:
    static CSingleton* m_pInstance;
};

//CSingleton.cpp
pthread_mutex_t CSingleton::mutex;
CSingleton* CSingleton::m_pInstance = NULL;
CSingleton* CSingleton::GetInstance()
{
    if (m_pInstance  == NULL)
    {
        pthread_mutex_lock(&mutex);
        if (m_pInstance  == NULL)
            m_pInstance  = new CSingleton();
        pthread_mutex_unlock(&mutex);
    }
    return m_pInstance;
}
class CSingleton  
{  
public:  
    static CSingleton* GetInstance()  
    {
        static CSingleton m_pInstance = CSingleton(); 
        return &m_pInstance; 
    }  

protected:
    CSingleton() { }
    ~CSingleton() { }
};
3. 饿汉式单例:类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在(线程安全)
//CSingleton.h
class CSingleton    
{    
public:    
    static CSingleton* GetInstance() { return m_CSingletonInstance; }  

protected:
  CSingleton() { }
  ~CSingleton() { }

private:
  static CSingleton* m_CSingletonInstance;
};

//CSingleton.cpp
CSingleton* CSingleton::m_CSingletonInstance = new CSingleton();
上一篇 下一篇

猜你喜欢

热点阅读