C++设计模式——一个基于C++11的万用单例模板类
2017-11-06 00:00
801 查看
摘要: C++11新特性;设计模式;单例模式
单例模式的目的很简单,创建一个全局唯一的对象(类or变量)。
多线程调用中的线程安全问题。
没有自动GC机制(垃圾回收)。
利用了C++11的智能指针和自解锁等,巧妙避免了所有问题,并实现自动GC。
单例模式概述
单例模式(Singleton),是设计模式里面最常见、最常用的设计模式,也是最简单、最容易实现的设计模式。单例模式的目的很简单,创建一个全局唯一的对象(类or变量)。
简单代码实现
//Simple_Singleton.h class Singleton { public: static Singleton* GetInstance() { if (!m_pSingleton) { m_pSingleton = new Singleton(); } return m_pSingleton; } static void DesInstance() { if (m_pSingleton) { delete m_pSingleton; m_pSingleton = nullptr; } } private: Singleton(); static Singleton* m_pSingleton; }; Singleton* Singleton::m_pSingleton = nullptr;
简单单例模式面临的问题
不能阻止析构、拷贝、赋值、隐式转换等问题。多线程调用中的线程安全问题。
没有自动GC机制(垃圾回收)。
一个基于C++11的万用单例模板类
//Magic_Singleton.h /************************************************************************/ /* 名称:万能单例类 */ /* 说明:可把任何类包装成线程安全的全局单例类,出口默认智能指针 */ /* 作者:Song */ /* Email:songshuda@vip.qq.com */ /************************************************************************/ #ifndef MAGIC_SINGLETON_H #define MAGIC_SINGLETON_H #include <mutex> #include <memory> template<typename T> class Magic_Singleton { public: //获取全局单例对象 template<typename ...Args> static std::shared_ptr<T> GetInstance(Args&&... args) { if (!m_pSington) { std::lock_guard<std::mutex> gLock(m_Mutex); if (nullptr == m_pSington) { m_pSington = std::make_shared<T>(std::forward<Args>(args)...); } } return m_pSington; } //主动析构单例对象(一般不需要主动析构,除非特殊需求) static void DesInstance() { if (m_pSington) { m_pSington.reset(); m_pSington = nullptr; } } private: explicit Magic_Singleton(); Magic_Singleton(const Magic_Singleton&) = delete; Magic_Singleton& operator=(const Magic_Singleton&) = delete; ~Magic_Singleton(); private: static std::shared_ptr<T> m_pSington; static std::mutex m_Mutex; }; template<typename T> std::shared_ptr<T> Magic_Singleton<T>::m_pSington = nullptr; template<typename T> std::mutex Magic_Singleton<T>::m_Mutex; #endif
利用了C++11的智能指针和自解锁等,巧妙避免了所有问题,并实现自动GC。
调用示例
//test.cpp #include <iostream> #include "Magic_Singleton.h" using namespace std; class MyClass { public: MyClass(const string& strData) : m_strData(strData) { cout << m_strData.data() << endl; }; ~MyClass() { cout << "destory" << endl; }; private: string m_strData; }; auto main()->int { //等同于入口函数int main() auto pClass = Magic_Singleton<MyClass>::GetInstance("create"); Magic_Singleton<MyClass>::DesInstance(); return 1; }
相关文章推荐
- C++设计模式——一个基于C++11的万用单例模板类
- 一个基于设计模式的面向对象的框架
- 基于人吃饭的例子设计一个装饰设计模式:
- 发布一个基于 Reactor 模式的 C++ 网络库
- 一个基于装饰者设计模式的上报框架
- 发布一个基于 Reactor 模式的 C++ 网络库
- 发布一个基于 Reactor 模式的 C++ 网络库
- C++设计模式5--单例模式Singleton--当前对象只有一个实例
- C++第5周任务【任务2】本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为第10章做运算符重载等积累些感性认识。
- 设计模式---单件(C++版) 一个简单实例(避免用户忘记delete单件实例)
- 最近准备做一个C++模式设计方面的学习总结,希望有路过看见的人推荐一下
- 公布一个基于 Reactor 模式的 C++ 网络库
- C++设计模式大总结_一个工程方便复习和修改
- 发布一个基于 Reactor 模式的 C++ 网络库
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- 基于c++11设计一个定时器timer
- jphone项目设计介绍(一个基于C++的应用程序框架以及软电话和日志服务器应用)
- 基于ACE设计一个c++网络游戏服务器框架引擎
- 【C++】学习笔记草稿版16(基于多态的设计模式)
- 发布一个基于 Reactor 模式的 C++ 网络库