服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ 单例模式的详解及实例

C++ 单例模式的详解及实例

2021-05-25 13:55sweet_wen C/C++

这篇文章主要介绍了C++ 单例模式的详解及实例的相关资料,这里对单例中的懒汉模式和饿汉模式进行实现和比较,需要的朋友可以参考下

C++ 单例模式的详解及实例

1.什么叫单例模式?

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。
通过单例模式, 可以做到:

(1)确保一个类只有一个实例被建立
(2)提供了一个对对象的全局访问指针
(3)在不影响单例类的客户端的情况下允许将来有多个实例

2.怎样实现单例模式

一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。

3.具体实现

(1)最简单的单例模式(懒汉模式)

懒汉模式:懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,顾名思义,懒汉么,很懒的,配置文件的实例直到用到的时候才会加载。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class SiglenTon
{
public:
  static SiglenTon *GetInstence()
  {
    if( p == NULL)
    {
      p = new SiglenTon();
    }
    return p;
  }
private:
  SiglenTon()
  {
    cout<<"SiglenTon()"<<endl;
  }
  static SiglenTon *p;
};
SiglenTon *SiglenTon::p = NULL;
int main()
{
  SiglenTon *p = SiglenTon::GetInstence();
  return 0;
}

(2)第一种方式没有考虑到线程安全

?
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
34
35
class SiglenTon //(线程安全的饿汉模式)
{
public:
  static SiglenTon *GetInstence()
  {
    cout<<"static SiglenTon *GetInstence()"<<endl;
    pthread_mutex_lock(&mutex);
    if( p == NULL)
    {
      pthread_mutex_lock(&mutex);
      p = new SiglenTon();
      pthread_mutex_unlock(&mutex);
    }
    pthread_mutex_unlock(&mutex);
    return p;
  }
 
private:
  SiglenTon()
  {
    cout<<"SiglenTon()"<<endl;
  }
  static SiglenTon *p;
};
SiglenTon *SiglenTon::p = NULL;
 
 
 
int main()
{
  SiglenTon *p = SiglenTon::GetInstence();
  SiglenTon *p1 = p->GetInstence();
 
  return 0;
}

(3)饿汉模式(饿汉模式本身就是线程安全的)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class SiglenTon
{
public:
  SiglenTon *GetInstence()
  {
    if( p == NULL)
    {
      return p;
    }
  }
private:
  SiglenTon()
  {
    cout<<"SiglenTon()"<<endl;
  }
  static SiglenTon *p;
};

以上就是对C++ 中单例模式的讲解,如有疑问请留言或者到本站社区进行交流讨论,感谢阅读,希望帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/sweet_wen/article/details/74165054

延伸 · 阅读

精彩推荐