创建型模式--单例模式
单例模式:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
特点:
1、私有的构造函数
2、私有的复制构造函数
3、私有的赋值操作符
问题:
1、线程安全
2、数据的清理
代码:
一般有三种写法:
方法一:一个不是线程安全的代码,而且也没有解决内存释放的问题:
1 class Singleton 2 { 3 public: 4 static Singleton* getInstance() 5 { 6 7 /**< 假如有两个线程,第一个线程运行时,判断pInstance是否为空,因为此时pInstance 8 * ==NULL,那么线程将会进入到if结构体内,假设,就在要执行new Singleton这个操作 9 * 时,时间片结束,那么此时pInstance还是为NULL,此时另一个线程运行,当它进行判 10 * 断时发现pInstance为空,所以会创建一次,当它执行完后,第一个线程执行,又会产 11 * 生一个新的实例,那么将会产生两个,所以此时是线程不安全的。要想保证安全,必须 12 * if前面加锁 13 */ 14 if(pInstance == NULL) 15 { 16 pInstance = new Singleton; 17 } 18 return pInstance; 19 }; 20 private: 21 Singleton(){}; 22 Singleton(const Singleton &); 23 Singleton& operator=(const Singleton &); 24 25 static Singleton *pInstance; 26 }; 27 28 Singleton* Singleton::pInstance = NULL;
方法二 :只解决了内存释放的问题:
1 class Singleton 2 { 3 public: 4 static Singleton* getInstance() 5 { 6 /**< 其实这里加上互斥操作,就可以实现,即是线程安全,又释放了内存 */ 7 if(pInstance == NULL) 8 { 9 pInstance = new Singleton; 10 } 11 return pInstance; 12 }; 13 14 class Garbage 15 { 16 public: 17 ~Garbage() 18 { 19 if(Singleton::pInstance) 20 { 21 delete pInstance; 22 } 23 }; 24 }; 25 private: 26 Singleton(){}; 27 Singleton(const Singleton &); 28 Singleton& operator=(const Singleton &); 29 30 static Singleton *pInstance; 31 static Garbage m_Garbage; /**< 当这个静态变量释放时,会自动去释放Singleton的资源*/ 32 };
方法三:即解决了线程安全的问题,也解决了内存释放的问题
1 class Singleton 2 { 3 public: 4 static Singleton* getInstance() 5 { 6 /**< 此函数会在全局区中分配空间,而且在整个程序退出时,清理数据 7 * ,所以就不会存在线程不安全的情况 8 */ 9 static Singleton single; 10 return &single; 11 }; 12 private: 13 Singleton(){}; 14 Singleton(const Singleton &); 15 Singleton& operator=(const Singleton &); 16 };