1.单例模式的分类
(1)饿汉单例模式
(2)懒汉单例模式
2.介绍饿汉单例模式、懒汉单例模式
饿汉单例模式:还没获取对象的时候,实例对象就已经产生了,一定是线程安全的。
懒汉单例模式:不是线程安全的,需要通过锁+双重判断进行线程安全控制。
3.代码实现
饿汉单例模式:
usingnamespacestd; classSingleton{ public: staticSingleton*getInstance()//3.获取唯一实例对象的方法 { if (instance==nullptr) { instance=newSingleton; } returninstance; } private: staticSingleton*instance;//2.定义一个唯一的实例对象Singleton()//1.构造函数私有化 { } Singleton(constSingleton&) =delete; Singleton&operator=(constSingleton&) =delete; }; Singleton*Singleton::instance{ nullptr }; intmain(void) { Singleton*p1=Singleton::getInstance(); Singleton*p2=Singleton::getInstance(); Singleton*p3=Singleton::getInstance(); return0; }
线程安全的懒汉单例模式:
usingnamespacestd; mutexmtx; classSingleton{ public: staticSingleton*getInstance()//3.获取唯一实例对象的方法 { lock_guard<mutex>guard(mtx); if (instance==nullptr) { if (instance==nullptr) { /*开辟内存给instance赋值构造对象*/instance=newSingleton; } } returninstance; } private: staticSingleton*instance;//2.定义一个唯一的实例对象Singleton()//1.构造函数私有化 { } Singleton(constSingleton&) =delete; Singleton&operator=(constSingleton&) =delete; }; Singleton*Singleton::instance{ nullptr }; intmain(void) { Singleton*p1=Singleton::getInstance(); Singleton*p2=Singleton::getInstance(); Singleton*p3=Singleton::getInstance(); return0; }