版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:C++设计模式-单例模式 本文地址:http://techieliang.com/2017/12/772/
本文标题:C++设计模式-单例模式 本文地址:http://techieliang.com/2017/12/772/
1. 介绍
几个重点:
- 构造函数为private
- 提供一个获取单例对象指针的函数
- 一个静态指针成员存储单例对象
注意:
- 获取单例对象也可以获取对象引用,但要注意拷贝构造函数和赋值运算符
- 如果有多线程访问单例,需要注意线程同步
2. 范例
源码GitHub:CppDesignPattern
2.1. 单线程
- #ifndef SIGLETON_H
- #define SIGLETON_H
- /**
- * @brief 非线程安全单例,无多线程时使用
- */
- class Singleton {
- public:
- /**
- * @brief 单例模式,获取实例化对象
- * @param 无
- * @return 单例对象
- */
- static Singleton *GetInstance();
- /**
- * @brief 单例模式,主动销毁实例化对象
- * @param 无
- * @return 无
- */
- static void DestoryInstance();
- private:
- /**
- * @brief 构造函数
- */
- Singleton();
- /**
- * @brief 单例模式在程序结束时自动删除单例的方法
- */
- class SingletonDel {
- public:
- ~SingletonDel() {
- if (m_instance != NULL) {
- delete m_instance;
- m_instance = NULL;
- }
- }
- };
- static SingletonDel m_singleton_del;///程序结束时销毁
- static Singleton *m_instance; //单例对象指针
- };
- #endif // SIGLETON_H
- //cpp
- #include "sigleton.h"
- Singleton* Singleton::m_instance = nullptr;
- Singleton *Singleton::GetInstance() {
- if (m_instance == nullptr) {
- m_instance = new Singleton();
- }
- return m_instance;
- }
- void Singleton::DestoryInstance() {
- if (m_instance != nullptr) {
- delete m_instance;
- m_instance = nullptr;
- }
- }
- Singleton::Singleton() {
- }
2.2. 多线程
- #ifndef THREAD_SAFE_SINGLETON_H
- #define THREAD_SAFE_SINGLETON_H
- /**
- * @brief 线程安全单例,多线程时使用
- */
- class ThreadSafeSingleton {
- public:
- /**
- * @brief 单例模式,获取实例化对象
- * @param 无
- * @return 单例对象
- */
- static ThreadSafeSingleton* GetInstance();
- /**
- * @brief 单例模式,主动销毁实例化对象
- * @param 无
- * @return 无
- */
- static void DestoryInstance();
- private:
- /**
- * @brief 构造函数
- */
- ThreadSafeSingleton();
- /**
- * @brief 单例模式在程序结束时自动删除单例的方法
- */
- class SingletonDel {
- public:
- ~SingletonDel() {
- if (m_instance != NULL) {
- delete m_instance;
- m_instance = NULL;
- }
- }
- };
- static ThreadSafeSingleton m_singleton_del;///程序结束时销毁
- static ThreadSafeSingleton *m_instance; //单例对象指针
- };
- #endif // THREAD_SAFE_SINGLETON_H
- #include "thread_safe_singleton.h"
- #include <QMutex>
- #include <QMutexLocker>
- namespace thread_safe_singleton_private {
- static QMutex mutex;
- }
- ThreadSafeSingleton* ThreadSafeSingleton::m_instance = nullptr;
- ThreadSafeSingleton *ThreadSafeSingleton::GetInstance() {
- if (m_instance == nullptr) {
- QMutexLocker lock(thread_safe_singleton_private::mutex);
- if (m_instance == nullptr) {
- m_instance = new ThreadSafeSingleton();
- }
- }
- return m_instance;
- }
- void ThreadSafeSingleton::DestoryInstance() {
- if (m_instance != nullptr) {
- delete m_instance;
- m_instance = nullptr;
- }
- }
- ThreadSafeSingleton::ThreadSafeSingleton() {
- }
上面的范例提供了主动销毁单例的方法同时提供了自动销毁的方法。
若主动销毁需注意其他存储了单例指针的对象
相关链接:C++设计模式
转载请以链接形式标明本文标题和地址:Techie亮博客 » C++设计模式-单例模式