C++单例模式

定义:

一个类有且仅有一个实例,并且提供一个访问它的全局访问点。
要点:
1、类只能有一个实例;
2、必须自行创建此实例;
3、必须自行向整个系统提供此实例。

实现一:单例模式结构代码

singleton.h文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
 
class Singleton
{
public :
   static Singleton* GetInstance();
protected :
   Singleton();
private :
   static Singleton *_instance;
};
 
#endif

singleton.cpp文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "singleton.h"
#include <iostream>
using namespace std;
 
Singleton* Singleton::_instance = 0;
 
Singleton::Singleton()
{
   cout<< "create Singleton ..." <<endl;
}
 
Singleton* Singleton::GetInstance()
{
   if (0 == _instance)
   {
     _instance = new Singleton();
   }
   else
   {
     cout<< "already exist" <<endl;
   }
 
   return _instance;
}

main.cpp文件代码如下:

?
1
2
3
4
5
6
7
8
9
#include "singleton.h"
 
int main()
{
   Singleton *t = Singleton::GetInstance();
   t->GetInstance();
 
   return 0;
}

实现二:打印机实例

singleton.h文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
 
class Singleton
{
public :
   static Singleton* GetInstance();
   void printSomething( const char * str2Print);
protected :
   Singleton();
private :
   static Singleton *_instance;
   int count;
};
 
#endif

singleton.cpp文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "singleton.h"
#include <iostream>
 
using namespace std;
 
Singleton* Singleton::_instance = 0;
 
Singleton::Singleton()
{
   cout<< "create Singleton ..." <<endl;
   count=0;
}
 
Singleton* Singleton::GetInstance()
{
   if (0 == _instance)
   {
     _instance = new Singleton();
   }
   else
   {
     cout<< "Instance already exist" <<endl;
   }
 
   return _instance;
}
 
void Singleton::printSomething( const char * str2Print)
{
   cout<< "printer is now working , the sequence : " <<++count<<endl;
   cout<<str2Print<<endl;
   cout<< "done\n" <<endl;
}

main.cpp文件代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
#include "singleton.h"
 
int main()
{
   Singleton *t1 = Singleton::GetInstance();
   t1->GetInstance();
   t1->printSomething( "t1" );
 
   Singleton *t2 = Singleton::GetInstance();
   t2->printSomething( "t2" );
   return 0;
}

Makefile文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CC=g++
CFLAGS = -g -O2 -Wall
 
all:
   make singleton
 
singleton:singleton.o\
   main.o 
   ${CC} -o singleton main.o singleton.o
 
clean:
   rm -rf singleton
   rm -f *.o
 
.cpp.o:
   $(CC) $(CFLAGS) -c -o $*.o $<

运行效果如下图所示:

 

可以看到,对打印顺序count的计数是连续的,系统中只有一个打印设备。

多线程,防止死锁,

class locker
{
public:
inline locker() { pthread_mutex_init(&mutex, NULL); }
inline ~locker() { pthread_mutex_destroy(&mutex); }
inline void lock() { pthread_mutex_lock(&mutex); }
inline void unlock() { pthread_mutex_unlock(&mutex); }

private:
pthread_mutex_t mutex;
};
赖汉单例模式代码:
if ( NULL == m_singleton)
{
locker llock;
llock. lock();
if ( NULL == m_singleton)
{
m_singleton = new _singleton();
}
llock. unlock();
}
return m_singleton;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值