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小时内删除。