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 }
我心自有明月在,不堕地狱不跪佛

浙公网安备 33010602011771号