当前位置: 首页 > article >正文

单例设计模式

单例设计模式

  • 什么是设计 模式
  • 单例设计模式
  • 什么是单例设计模式
  • 如何实现单例设计模式
    • 单例设计模式的实现
      • 懒汉式
      • 饿汉式
  • 单例设计模式的优缺点

什么是设计 模式

模式:套路 -----> 写代码的习惯
设计模式:前人总结具有代表性套路的模式
官方说法:它是一套被反复使用,多数人知晓,经过分类编目的,
代码设计经验的总结。

设计模式的究极目标:通过增加的形式去减少因为变化而要修改源码的问题(维护问题)

单例设计模式

什么是单例设计模式

保证整个类的使用只有一个对象
例如:
1.多线程网络资源初始化
2.回收站机制
3.任务管理器
4.日志管理

如何实现单例设计模式

1.构造函数私有化
2.提供一个全局的静态方法,访问唯一对象
3.类中定义一个静态指针,指向唯一对象

单例设计模式的实现

有2种方式
1.懒汉式
2.饿汉式

懒汉式

在类中创建一个对象

//单例设计模式
#include<iostream>
#include<string>

using namespace std;

class singleton
{
public:
	//类中定义一个静态指针,指向唯一对象
	static singleton* m_singleton;
	//提供一个全局的静态方法,访问唯一对象
	static singleton* get()
	{
		if (m_singleton == NULL)
		{
			m_singleton = new singleton;
			return m_singleton;
		}
	}
private:
	singleton() 
	{
		cout << "构造对象" << endl;
		m_singleton = nullptr;
		
	}
};

singleton* singleton :: m_singleton = nullptr;  //静态成员需要类外初始化

int main()
{

	singleton* p1 = singleton::get();  //静态成员的访问,不需要对象,但是要加类名限定
	cout << "p1 = " << p1 << endl;

	singleton* p2 = singleton::get();
	cout << "p2 = " << p2 << endl;

	singleton* p3 = singleton::get();
	cout << "p3 = " << p3 << endl;
	return 0;
}

在这里插入图片描述

如果所示,p2与p3的地址是一样的,单例设计模式只有唯一的一个对象

但其实按理说我觉得3个的地址都应该一样
可能是我写错了,或者说对这单例设计模式还有不知道的细节,先暂时就这样

在这里插入图片描述

饿汉式

饥不择食,不管用不用,在全局中创建一个对象
饿汉式跟懒汉式的代码区别不大

#include<iostream>
#include<string>

using namespace std;

class singleton
{
public:
	//类中定义一个静态指针,指向唯一对象
	static singleton* m_singleton;
	//提供一个全局的静态方法,访问唯一对象
	static singleton* get()
	{
		return m_singleton;
	}
private:
	singleton()
	{
		cout << "构造对象" << endl;
		m_singleton = nullptr;

	}
};

singleton* singleton::m_singleton = new singleton;

int main()
{

	singleton* p1 = singleton::get();  //静态成员的访问,不需要对象,但是要加类名限定
	cout << "p1 = " << p1 << endl;

	singleton* p2 = singleton::get();
	cout << "p2 = " << p2 << endl;

	singleton* p3 = singleton::get();
	cout << "p3 = " << p3 << endl;
	return 0;
}

在这里插入图片描述

当然这里饿汉式就正常了,三个地址一样,说明单例设计模式,只能有一个唯一对象

单例设计模式的优缺点

优点:
1.内存只有一个对象,节省内存空间
2.避免频繁创建和销毁对象,提高性能
3.避免对共享的资源多重占用,简化访问

缺点:
1.不适合变化频繁的对象
2.长时间不使用对象,导致系统回收掉


http://www.kler.cn/a/7142.html

相关文章:

  • 5. langgraph中的react agent使用 (从零构建一个react agent)
  • 【AlphaFold3】开源本地的安装及使用
  • 【STL】set,multiset,map,multimap的介绍以及使用
  • 性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章
  • UE5运行时创建slate窗口
  • 【Apache Paimon】-- 1 -- Apache Paimon 是什么?
  • VS2019使用VLD(Visual Leak Detector)检测CPP内存泄漏
  • FPGA有哪些优质的带源码的IP开源网站?
  • ChatGPT如何写作-怎么让chatGPT批量写作
  • GPG Overview
  • 算法学习|动态规划 LeetCode 1049. 最后一块石头的重量 II、 494. 目标和、474.一和零
  • Vue3学习笔记(9.3)
  • 常用的32种设计模式
  • 记一次ios重打包签名的过程
  • Vue|计算属性
  • ATE测试工程师还有发展前景吗?薪资待遇怎么样?
  • [ctfshow 2023 愚人杯] crypto,rev,pwn
  • 【JavaWeb】3—JavaScript
  • 开发板 ping 虚拟机
  • redis源码解析(三)——dict
  • 网络优化小结
  • Matplotlib 数据绘图基础入门
  • json-chatGPT-httpstatus
  • Redis7搭建主从+哨兵通俗易懂
  • 人工智能和5G相结合会碰撞出怎样的火花?
  • EMC经典问答85问(6-8问)