C++设计模式解析之单例模式解析
单例模式定义
该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
在C++中,我个人的理解是,不需要自己new类指针,这样一方面也方便程序员自己管理内存,另一方面可以节省系统指针,减少占用内存资源。
单例模式的实现要求
简单的来说,就是一个类要有唯一的单例,而且这个单例类能够被其他对象所调用,不能用,那就没意义了嘛 。
单例模式的代码实现
前面两个定义和实现要求理解之后,让我们来看看单例模式是如何在C++中被巧妙地利用。
首先看一下使用单例模式的类
头文件单例类的定义如下:
//单例模式类
class Singleton
{
public:
Singleton();
~Singleton();
void walk();
static Singleton * getSingleton(); //返回单例指针
private:
static Singleton * m_Instance;//单例全局指针
//程序结束时释放静态成员
class CGararge // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGararge()
{
//这边清空单例指针 回收内存
if (Singleton::m_Instance)
delete Singleton::m_Instance;
}
};
static CGararge Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
};
其中定义了单例成员指针m_Instance或获取单例指针的方式
还定义了类CGarbage 用于释放单例指针
接下来是实现cpp文件
Singleton::Singleton()
{
}
Singleton* Singleton::m_Instance = nullptr;
Singleton::~Singleton()
{
cout << "被析构了" << endl;
}
void Singleton::walk()
{
cout << " I AM WALKING ALONE" << endl;
}
Singleton* Singleton::getSingleton()
{
//如果没被实例化 就先new一个
if(m_Instance==nullptr)
{
m_Instance = new Singleton();
}
return m_Instance;
}
这里面很容易看出来 getSingleton()函数用来new单例指针 判断是否单例指针存在,这样的好处 是可以保证整个类的全局指针 只占用一个内存地址,无需每次都要new
接下来看一下测试代码
Singleton * cur_Instance = Singleton::getSingleton();
cur_Instance->walk();
cout << "旧的地址" << cur_Instance << endl;
Singleton * cur_NextInstance = cur_Instance->getSingleton();
cur_NextInstance->walk();
cout << "新的地址"<< cur_NextInstance << endl;
int mm ;
cin >> mm;
运行程序 :
可以明显的看出,只产生了一个实例指针,这样很方便我们去管理内存,也不占用内存资源
接下来看一下不用单例模式的常规类会有什么不一样
头文件
class People
{
public:
void walk();
};
定义了一个人的类 里面一个walk方法
实现
void People::walk()
{
cout << " I AM WALKING ALONE" << endl;
}
很简单 和上面一样
接下来看一下测试代码
People *p_people = new People();
p_people->walk();
People *p_nextPeople = new People();
p_nextPeople->walk();
cout << "旧地址" << p_people << endl;
cout << "新地址" << p_nextPeople << endl;
delete p_people;
delete p_nextPeople;
测试代码也很简单
new了两个指针 然后执行walk函数 最后看一下地址 然后释放内存
看一下运行结果:
可以明显看出 这个产生了两个内存,如果在大型项目当中 需要在不同的文件当中引用类,很明显,对于程序本身占用内存 是个负担,而且 很容易造成内存泄漏的现象,所以单例模式的优势也显而易见,可以尽可能占用少的内存,并且及其易于管理内存,希望借着两个例子,能够给大家带来一点启发。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
相关文章
- C++学习——c++逗号操作符说明(附加全部运算符优先级)
- CentOS 7系统离线安装gcc,gcc-c++,让你摆脱联网装不了的困惑!
- c++语言截取字符串,详解C++ string常用截取字符串方法
- c++贪吃蛇代码[通俗易懂]
- 10min快速回顾C++语法(三)
- C++项目贪吃蛇游戏笔记-C语言版
- 【c++】【基础】【primer_plus】【第六章】 分支与逻辑运算符
- C/C++条件运算符你不知道的那些事[通俗易懂]
- C++结构体和类的区别_c++有结构体吗
- 软件开发入门教程网之C++ 标准库
- 【C++】通过stack、queue、deque理解适配器模式
- C和C++跨平台IDE集成开发环境CLion软件获取安装激活汉化教程
- Linux基础:讲解Linux C++多线程同步的方式
- C++ map获取(访问)元素详解
- C++ unordered_map及其基本结构和特性
- C++ partition(STL partition)算法使用详解
- c++STL容器总结之:vertor与list的应用
- C++中静态存储区与栈以及堆的区别详解
- 浅析C/C++中被人误解的SIZEOF
- 让Sqlite脱离VC++Runtime独立运行的方法