【C++设计模式】创建型模式 — 单例模式
2023-09-14 09:14:31 时间
1、什么叫单例模式?
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
注意一下几点:
-
单例类只能由一个实例化对象。
-
单例类必须自己提供一个实例化对象。
-
单例类必须提供一个可以访问唯一实例化对象的接口。
单例模式分为懒汉和饿汉两种实现方式。
懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化一个对象。在访问量较小,甚至可能不会去访问的情况下,采用懒汉实现,这是以时间换空间。
饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
2、为什么使用单例模式?
- 在多个线程之间,比如初始化一次socket资源;比如servlet环境,共享同一个资源或者操作同一个对象
-
在整个程序空间使用全局变量,共享资源
-
大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。
因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。
3、实现单例步骤?
- 构造函数私有化
- 提供一个全局的静态方法
- 在类中定义一个静态指针,指向本类的变量的静态变量指针。
4、基础单例
4.1 懒汉式单例
#include <iostream>
using namespace std;
//懒汉式
class SingeIton
{
//构造函数私有化
private:
SingeIton()
{
m_singer = NULL;
m_count = 0;
cout<<"SingeIton...do"<<endl;
}
public:
//类中定义一个静态指针
static SingeIton *getInstance()
{
if(m_singer == NULL)
{
m_singer = new SingeIton;
}
return m_singer;
}
//提供一个全局的静态方法
static void printT()
{
cout<<"m_count:"<<m_count<<endl;
}
private:
static SingeIton *m_singer;
static int m_count;
};
SingeIton *SingeIton::m_singer = NULL;//懒汉式,没有创建单例对象;
int SingeIton::m_count = 0;
int main()
{
cout<<"演示 懒汉式"<<endl;
SingeIton *p1 = SingeIton::getInstance();//只有在使用的时候才会创建
SingeIton *p2 = SingeIton::getInstance();
if(p1 != p2)
{
cout<<"不是同一个对象"<<endl;
}
else
{
cout<<"是同一个对象"<<endl;
}
p1->printT();
p2->printT();
system("pause");
return 0;
}
结果显示:
演示 懒汉式
SingeIton...do
是同一个对象
m_count:0
m_count:0
4.2 饿汉模式
#include <iostream>
using namespace std;
//饿汉式
class SingeIton
{
//构造函数私有化
private:
SingeIton()
{
m_singer = NULL;
m_count = 0;
cout<<"构造函数 SingeIton...do"<<endl;
}
public:
//类中定义静态指针
static SingeIton *getInstance()
{
return m_singer;
}
static SingeIton FreeInstance()
{
if(m_singer != NULL)
{
delete m_singer;
m_singer = NULL;
m_count = 0;
}
}
//提供一个全局的静态方法
static void printT()
{
cout<<"m_count:"<<m_count<<endl;
}
private:
static SingeIton *m_singer;
static int m_count;
};
SingeIton *SingeIton::m_singer = new SingeIton;//不管你创建不创建实例,均把实例new出来
int SingeIton::m_count = 0;
int main()
{
cout<<"****演示 饿汉式****"<<endl;
SingeIton *p1 = SingeIton::getInstance();//只有在使用的时候才会创建
SingeIton *p2 = SingeIton::getInstance();
if(p1 != p2)
{
cout<<"不是同一个对象"<<endl;
}
else
{
cout<<"是同一个对象"<<endl;
}
p1->printT();
p2->printT();
SingeIton::FreeInstance();
SingeIton::FreeInstance();
system("pause");
return 0;
}
结果显示:
****演示 饿汉式****
是同一个对象
m_count:0
m_count:0
相关文章
- C++版OpenCV使用神经网络ANN进行mnist手写数字识别[通俗易懂]
- 【2022新书】C++软件设计:高质量软件的设计原则和模式
- c++ accept_怎么把汇编语言转化为c语言
- C、C++ 和 Java 中的浮点运算和关联性
- C++11动态模板参数和type_traits
- C++ Primer Plus习题及答案-第十三章
- 从超过100万个项目中搜索C++代码示例
- C++的类型转换
- C++ 测试框架 GoogleTest 初学者入门篇 乙
- C++学生信息管理系统演示和说明(文件版)
- C++中的单例模式(普通,2B,文艺)
- C++中的单例模式介绍
- C++Primer笔记之关联容器的使用详解
- VC++中HTControl控制类使用之CHTDlgBase对话框基类实例