单例模式用法

main.cpp

#include "singleton.h"
#include <iostream>

using namespace std;

Singleton::GC Singleton::GC::gc; // 重要

int main()
{
    //Singleton single = Singleton::GetInstance();

	//Singleton *pSingleton1 = Singleton::GetInstance();
	//Singleton *pSingleton2 = Singleton::GetInstance();

	//cout << (pSingleton1 == pSingleton2) << endl;

	//Singleton::GetInstance().doSomething();  // OK
	//Singleton single = Singleton::GetInstance();  // Error 不能编译通过

    Singleton::GetInstance();
    //Singleton::GetInstance()->DestoryInstance();  // 手动释放

    return 0;
}

 singleton.h

#ifndef SINGLETON_H
#define SINGLETON_H

#include <iostream>

using namespace std;

 非真正意义上的单例
//class Singleton
//{
//public:
//    static Singleton& GetInstance()
//    {
//        static Singleton instance;
//        return instance;
//    }

//private:
//    Singleton() {}
//};


 单例
//class Singleton
//{
//public:
//    // 修改返回类型为指针类型
//    static Singleton* GetInstance()
//    {
//        static Singleton instance;
//        return &instance;
//    }

//private:
//    Singleton() {}
//};

 单例
//class Singleton
//{
//public:
//    static Singleton& GetInstance()
//    {
//        static Singleton instance;
//        return instance;
//    }

//    void doSomething() {
//        cout << "Do something" << "\n";
//    }

//private:
//    Singleton() {}  // 构造函数(被保护)
//    Singleton(Singleton const &);  // 无需实现
//    Singleton& operator = (const Singleton &);  // 无需实现
//};

 单例 - 懒汉式/饿汉式公用
//class Singleton
//{
//public:
//    static Singleton* GetInstance();

//private:
//    Singleton() {}  // 构造函数(被保护)

//private:
//    static Singleton *m_pSingleton;  // 指向单例对象的指针
//};

//#include <iostream>
//#include <mutex>
//using namespace std;
//
 单例 - 懒汉式/饿汉式公用
//class Singleton
//{
//public:
//    static Singleton* GetInstance();
//private:
//    Singleton() {}  // 构造函数(被保护)
//
//private:
//    static Singleton *m_pSingleton;  // 指向单例对象的指针
//    static mutex m_mutex;  // 锁
//};


// 单例 - 懒汉式/饿汉式公用
class Singleton
{
public:
    static Singleton* GetInstance();
    //    static void DestoryInstance()
    //    {
    //        if (m_pSingleton != NULL) {
    //            delete m_pSingleton;
    //            m_pSingleton = NULL;
    //        }
    //    }

private:
    Singleton() {}  // 构造函数(被保护)

private:
    static Singleton *m_pSingleton;  // 指向单例对象的指针

    // GC 机制
    class GC
    {
    public:
        ~GC()
        {
            // 可以在这里销毁所有的资源,例如:db 连接、文件句柄等
            if (m_pSingleton != NULL) {
                cout << "Here destroy the m_pSingleton..." << endl;
                delete m_pSingleton;
                m_pSingleton = NULL;
            }
        }
        static GC gc;  // 用于释放单例
    };
};

#endif // SINGLETON_H

 singleton.cpp 

#include "singleton.h"

 单例 - 懒汉式
//Singleton *Singleton::m_pSingleton = NULL;

//Singleton *Singleton::GetInstance()
//{
//    if (m_pSingleton == NULL)
//        m_pSingleton = new Singleton();

//    return m_pSingleton;
//}

 单例 - 饿汉式
//Singleton *Singleton::m_pSingleton = new Singleton();

//Singleton *Singleton::GetInstance()
//{
//    return m_pSingleton;
//}


 单例 - 懒汉式(双检锁 DCL 机制)
//Singleton *Singleton::m_pSingleton = NULL;
//mutex Singleton::m_mutex;
//
//Singleton *Singleton::GetInstance()
//{
//    if (m_pSingleton == NULL) {
//        std::lock_guard<std::mutex> lock(m_mutex);  // 加锁
//        if (m_pSingleton == NULL) {
//            m_pSingleton = new Singleton();
//        }
//    }
//    return m_pSingleton;
//}


// 单例 - 懒汉式(双检锁 DCL 机制)
Singleton *Singleton::m_pSingleton = NULL;

Singleton *Singleton::GetInstance()
{
    if (m_pSingleton == NULL)
		m_pSingleton = new Singleton();

    return m_pSingleton;
}

猜你喜欢

转载自blog.csdn.net/qq_31231915/article/details/122753040