Singleton(单例)

5. Singleton(单例)

5.1 定义

  确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例

5.2 应用

  单例模式的主要作用是确保一个类只有一个实例存在。单例模式可以用在建立目录、数据库连接等需要单线程操作的场合,用于实现对系统资源的控制。

5.3 懒汉单例模式

5.3.1 定义

  第一次引用类时,才进行对象实例化。

5.3.2 c++源码例程

 非线程安全的懒汉单例模式

 1 class Singleton
 2 {
 3 public:
 4     static Singleton* getInstance();
 5     ~Singleton(){}
 6  7 private:
 8     Singleton(){}                                        //构造函数私有,防止通过拷贝构造,赋值运算实例化对象
 9     Singleton(const Singleton& obj) = delete;            //明确拒绝
10     Singleton& operator=(const Singleton& obj) = delete; //明确拒绝
11 
12     static Singleton* m_pSingleton;
13 };
14 15 Singleton* Singleton::m_pSingleton = NULL;
16 17 Singleton* Singleton::getInstance()
18 {
19     if(m_pSingleton == NULL)
20     {
21         m_pSingleton = new Singleton;
22     }
23     return m_pSingleton;
24 }

线程安全的懒汉单例模式

 1 std::mutex mt;
 2 
 3 class Singleton
 4 {
 5 public:
 6     static Singleton* getInstance();
 7 private:
 8     Singleton(){}                                    //构造函数私有
 9     Singleton(const Singleton&) = delete;            //明确拒绝
10     Singleton& operator=(const Singleton&) = delete; //明确拒绝
11 
12     static Singleton* m_pSingleton;
13 
14 };
15 Singleton* Singleton::m_pSingleton = NULL;
16 
17 Singleton* Singleton::getInstance()
18 {
19     if(m_pSingleton == NULL)
20     {
21         mt.lock();
22         if(m_pSingleton == NULL)
23         {
24             m_pSingleton = new Singleton();
25         }
26         mt.unlock();
27     }
28     return m_pSingleton;
29 }

5.4 饿汉单例模式

5.4.1 定义

  类加载时,就进行对象实例化

 1 //饿汉式:线程安全,注意一定要在合适的地方去delete它
 2 class Singleton
 3 {
 4 public:
 5     static Singleton* getInstance();
 6 private:
 7     Singleton(){}                                    //构造函数私有
 8     Singleton(const Singleton&) = delete;            //明确拒绝
 9     Singleton& operator=(const Singleton&) = delete; //明确拒绝
10 11     static Singleton* m_pSingleton;
12 };
13 14 Singleton* Singleton::m_pSingleton = new Singleton();
15 16 Singleton* Singleton::getInstance()
17 {
18     return m_pSingleton;
19 }

 

posted @ 2020-11-03 14:44  昨日明眸  阅读(209)  评论(0)    收藏  举报