C++单例模式(Singleton )的实现
C++系列第⼀章 C++单例模式第⼆章 数据流对象CData 第三章 基于基础数据类型的封解包模板第四章 FIFO单链列表第⼋章 消息中⼼第九章 ⽹络访问器第⼗章 HttpClient 第⼗⼀章 FTPClient 第⼗⼆章 Socket客户端第⼗三章 Socket服务端
第⼗四章 WebSocket
⼤部分章节不会详细讲解,基本是以源码形式展现给⼤家,欢迎各路⼤侠搬砖和点评^^,详细源码查看
前⾔
在程序编程中,经常需要某个类在程序的声明周期中只需要⼀个实例存在,可不同模块中共享某个函数接⼝、功能或数据,这种设计模式被称为。单例模式的书⾯定义如下:也叫单⼦模式,是⼀种常⽤的软件设计模式。通过单例模式可以保证系统中,应⽤该模式的类⼀个类只有⼀个实例(即⼀个类只有⼀个对象实例)。
更新⽇期
更新内容2021.03.17优化代码
CSingleton.hpp
_#ifndef CSingleton_hpp #define CSingleton_hpp #include <stdio.h>#include <pthread.h>#include <memory>#include "CDefType.hpp"ZJ_NAMESPACE_BEGIN class CSinGuard {public : CSinGuard () { m_lGrdCnt = 0; pthread_mutex_init (&m_cs , nullptr ); } ~CSinGuard () { pthread_mutex_destroy (&m_cs ); } int IsGuarded () const { return (m_lGrdCnt > 0); } public : class CGuard { public : CGuard (CSinGuard & rg ):m_rg (rg ) { m_rg .Guard (); };
1
2
3
单例模式的几种实现方式4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CGuard (CSinGuard & rg ):m_rg (rg ) { m_rg .Guard (); }; ~CGuard () { m_rg .Unguard (); } private : CSinGuard & m_rg ; }; private : void Guard () { pthread_mutex_lock (&m_cs ); m_lGrdCnt ++; } //引⽤+1 void Unguard () { m_lGrdCnt --; pthread_mutex_unlock (&m_cs ); } //引⽤-1 friend class CSinGuard ::CGuard ; private : pthread_mutex_t m_cs ; //线程锁 long m_lGrdCnt ; //引⽤计数};template <class T >class CSingleton {public : static inline T * Instance (); static inline void Release (); private : CSingleton (void ) {} virtual ~CSingleton (void ) {} CSingleton (const CSingleton &) {} CSingleton & operator = (const CSingleton &) {} static std ::unique_ptr <T > m_Instance ; //智能指针,会⾃动释放 static CSinGuard m_sg ; //单例安全锁};//声明单例(对象)模板template <class T >std ::unique_ptr <T > CSingleton <T >::m_Instance ;//声明单例对象安全锁模板template <class T >CSinGuard CSingleton <T >::m_sg ;//获取单例template <class T >inline T * CSingleton <T >::Instance (){ if (m_Instance .get () == null
ptr ) { CSinGuard ::CGuard gd (m_sg ); //上锁,防⽌多线程同时访问 if (m_Instance .get () == nullptr ) { m_Instance .reset (new T ); } } return m_Instance .get ();}//释放单例template <class T >inline void CSingleton <T >::Release (){ CSinGuard ::CGuard gd (m_sg ); m_Instance .release ();}#define DECLARE_SINGLETON_CLASS(Type) \
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
使⽤⽅法在需要使⽤单例的类的头⽂件中引⽤单例⽂件:#include “CSingleton.hpp”在需要使⽤单例的类中声明为单例类(即引⽤单例⽂件的代码块构造成单例模式):DECLARE_SINGLETON_CLASS(该类的名称);单例类的调⽤:
单例类的释放:#define DECLARE_SINGLETON_CLASS(Type) \friend class std::unique_ptr<Type>; \friend class CSingleton<Type>; \static Type* Instance() { Type *shareClass = CSingleton<Type>::Instance(); return shareClass; } \static void Release() { \ Type *shareClass = CSingleton<Type>::Instance(); \ if (shareClass) { \ delete shareClass; \ shareClass = nullptr; \ } \ CSingleton<Type>::Release(); \}ZJ_NAMESPACE_END #endif /* CSingleton_hpp */
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100class CThreadPool {public : CThreadPool (); virtual ~CThreadPool (); DECLARE_SINGLETON_CLASS (CThreadPool ); void TestSingleton () { printf ("It is address:%p", this ); };};
1
2
3
4
5
6
7
8
9CThreadPool ::Instance ()->TestSingleton ();
1CThreadPool ::Release ();1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论