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

设计模式—— 单例设计模式

单例设计模式

什么是单例模式

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

为什么使用单例模式

在应用系统开发中,我们常常有以下需求:

1.需要生成唯一序列的环境

2.需要频繁实例化然后销毁的对象。

3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

4.方便资源相互通信的环境

实际案例:

  • 多线程中网络资源初始化
  • 回收站机制
  • 任务管理器
  • 应用程序日志管理

单例模式实现步骤

  1. 构造函数私有化
  2. 提供一个全局的静态方法,访问唯一对象
  3. 类中定义一个静态指针,指向唯一对象
    在这里插入图片描述

单例模式实现代码

懒汉式

#include <iostream>
using namespace std;
//懒汉式
class SingleTon 
{
private:SingleTon();
public:static SingleTon* m_singleTon;static SingleTon* GetInstance();void TestPrint();
};
//懒汉式并没有创建单例对象
SingleTon* SingleTon::m_singleTon = NULL;		
int main()
{SingleTon* p1 = SingleTon::GetInstance();SingleTon* p2 = SingleTon::GetInstance();cout << "p1:"<<  hex << p1 << endl;cout << "p2:" << hex << p2 << endl;p1->TestPrint();p2->TestPrint();return 0;
}
SingleTon::SingleTon()
{m_singleTon = NULL;cout << "构造了对象....." << endl;
}
SingleTon* SingleTon::GetInstance()
{if (m_singleTon == NULL) {m_singleTon = new SingleTon;}return m_singleTon;
}
void SingleTon::TestPrint()
{cout << "测试调用....." << endl;
}

饿汉式

#include <iostream>
using namespace std;
//懒汉式
class SingleTon 
{
private:SingleTon();
public:static SingleTon* m_singleTon;static SingleTon* GetInstance();void TestPrint();
};
//饿汉式创建单例对象
SingleTon* SingleTon::m_singleTon = new SingleTon;		
int main()
{SingleTon* p1 = SingleTon::GetInstance();SingleTon* p2 = SingleTon::GetInstance();cout << "p1:"<<  hex << p1 << endl;cout << "p2:" << hex << p2 << endl;p1->TestPrint();p2->TestPrint();return 0;
}
SingleTon::SingleTon()
{m_singleTon = NULL;cout << "构造了对象....." << endl;
}
SingleTon* SingleTon::GetInstance()
{return m_singleTon;
}
void SingleTon::TestPrint()
{cout << "测试调用....." << endl;
}

单例模式优缺点

优点

  • 在内存中只有一个对象,节省内存空间;
  • 避免频繁的创建销毁对象,可以提高性能;
  • 避免对共享资源的多重占用,简化访问;
  • 为整个系统提供一个全局访问点。

缺点

  • 不适用于变化频繁的对象;
  • 如果实例化的对象长时间用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;

相关文章:

  • leetcode 动态规划(单词拆分)
  • 面向对象的三大特性
  • Kali安装Xrdp结合内网穿透实现无公网ip远程访问系统桌面
  • 单例模式的八种写法、单例和并发的关系
  • 打印日期c++
  • Java获取文件的后缀名称
  • netcore html to pdf
  • 代码随想录算法训练营第32天|122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
  • 基于反卷积方法的重大突破:结构光系统中的测量误差降低3倍
  • 设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
  • Linux中常使用的命令之ls、cd、pwd、mkdir、rmdir
  • 数字后端设计实现之自动化useful skew技术(Concurrent Clock Data)
  • Linux - No space left on device
  • 后端程序员开发win小工具(未完待续)
  • JS浏览器的默认行为及阻止行为,阻止右键菜单、阻止超链接跳转、阻止拖拽事件
  • python3.6+scrapy+mysql 爬虫实战
  • __proto__ 和 prototype的关系
  • 「面试题」如何实现一个圣杯布局?
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • centos安装java运行环境jdk+tomcat
  • Kibana配置logstash,报表一体化
  • node学习系列之简单文件上传
  • ViewService——一种保证客户端与服务端同步的方法
  • web标准化(下)
  • 简单数学运算程序(不定期更新)
  • 老板让我十分钟上手nx-admin
  • 浏览器缓存机制分析
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 我看到的前端
  • 通过调用文摘列表API获取文摘
  • ​​​​​​​​​​​​​​Γ函数
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • $refs 、$nextTic、动态组件、name的使用
  • (转)平衡树
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET : 在VS2008中计算代码度量值
  • .Net Web窗口页属性
  • .NET 常见的偏门问题
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net 获取url的方法
  • .net 微服务 服务保护 自动重试 Polly
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .ui文件相关
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @SentinelResource详解
  • [AIGC] MySQL存储引擎详解
  • [APIO2015]巴厘岛的雕塑
  • [BJDCTF2020]The mystery of ip
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [CC-FNCS]Chef and Churu