1 概述

在我们的日常软件开发过程中,经常会发现某些对象在整个软件生命周期中,只需要创建一个实例,如果创建多个实例,可能导致许多问题出现,比如程序的行为异常、资源使用过量或者是不一致的结果等。像常见的线程池、缓存、对话框、日志对象、硬件设备的驱动程序等等,在整个软件运行过程中只需要创建一个对象,常见的解决思路是设置为全局变量,但全局变量不能保证只有一个实例被创建,尤其在多人合作开发的大型程序中,没有有效的沟通和约定,很容易导致问题。另一个问题是,有些对象并不是程序每次运行都会用到,如果程序一启动就创建所有的对象,会非常的耗费系统的资源,在资源有限的情况下,会导致整个程序运行异常。上述问题,通过单例模式就能很好的解决。单例模式给对象提供了一个统一的全局访问点,确保只有一个实例被创建,并且可以实现仅在需要使用的时候才去创建,避免了非必要的创建,从而避免了资源的浪费。单例模式有全局变量的功能,又没有全局变量的缺点。

2 实现原理

要想阻止外部随意创建对象,首先需将类的构造函数设为私有,这样外部就不能进行对象的创建。同时类内部提供一个静态的获取对象的函数,外部通过这个静态函数进行对象的获取。

这种方式是单例模式的最简单实现,这种简单方式存在一个问题,如果有多个线程同时调用getInstance()函数,可能会导致创建多个对象,避免这种现象的方式给getInstance()函数加锁,保证一次只能有一个线程访问这段代码。

在C++中还有另外一种简洁模式实现此功能,就是使用局部静态变量的方式。局部静态变量在程序执行到该对象的声明处时被首次初始化,并且局部静态变量初始化只会执行一次。

单例模式——创建独一无二的对象相关推荐

  1. 单例模式:创建独一无二的对象

    单例模式(Singleton Pattern): 用来创建独一无二的,只能有一个实例的对象的入场券. 作用:有些对象我们只需要一个,比如:线程池.缓存.对话框.处理偏好设置.注册表等对象,这些对象只能 ...

  2. 【设计模式】五、单例模式(独一无二的对象)

    一.概述: 有一些对象我们只需要一个,比方说:线程池(threadpool).缓存(cache).对话框.处理偏好设置和注册表对象.日志对象.充当打印机.显卡等设备的驱动程序的对象.事实上这些对象只需 ...

  3. 趣谈设计模式 | 单例模式(Singleton) :独一无二的对象

    文章目录 单例模式 饿汉模式 懒汉模式 懒汉和饿汉的区别 单例模式 一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全 局访问点,该实例被所有程序模块共享. ...

  4. 如何更好的创建Java对象

    2019独角兽企业重金招聘Python工程师标准>>> 静态工厂 除了使用构造函数创建对象外,还可以使用静态工厂来创建对象,JDK中大量使用了这种技巧,例如: public stat ...

  5. 设计模式(2)--Singleton(单例模式)--创建型

    1.模式定义: 单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 2.模式特点: (1)单例类只能有一个实例. (2)单例类必须自己创建自己的唯一实例. (3)单例类必须给所有 ...

  6. js单例模式——创建弹窗

    一.了解单例模式 单例模式的定义:保证一个类仅有一个实例,并提供一个访问他的全局访问点 单例模式的核心:是确保只有一个实例,并提供全局访问 二.javascript中的单例模式 在js中,我们经常会把 ...

  7. IOC容器创建bean对象的4种方式

    前言: Spring容器创建bean对象,一般通过反射机制查找bean元素的class属性值来找到要实例化的类,从而实例化bean对象.这便是调用构造方法来实例化bean对象 在某些情况下,若采用简单 ...

  8. OpenCV 笔记(06)— Mat 结构、像素值存储方法、创建 Mat 对象各种方法、Mat 对象的运算

    数字图像中的每个点都称为像素(对于图像元素),并且每个像素可以存储一个或多个值,这取决于它是否是仅存储一个值的黑白图像(也称为二进制图像,比如只存储0或1),还是存储两个值的灰度图像,或者是存储三个值 ...

  9. java string对象创建_String对象创建个数

    s = new String("xyz");创建了几个String Object?两个对象,一个是"xyx",一个是指向"xyx"的引用对象 ...

最新文章

  1. 5GS 协议栈 — N1 接口的协议栈(NAS)
  2. Python--三元运算与lambda表达式
  3. Training RNNs as Fast as CNNs
  4. wordpress备份方法比较
  5. idea中使用git直接提交本地写好的代码
  6. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程
  7. python rtftotxt_利用python将docx文件转为txt
  8. 01.00 简单工厂模式
  9. python vtk dicom_Python vtk读取并显示dicom文件示例
  10. Android每周一轮子:Nvwa(热修复)
  11. 无法识别依赖属性_设计模式起步-UML学习 - 认识UML类图(依赖)
  12. 亲串 (hdu 2203 KMP)
  13. Swift高仿喜马拉雅APP之一Charles抓包、图片资源获取等
  14. Mybatis插件动态数据库链接
  15. 概念数据模型、逻辑数据模型、物理数据模型详解
  16. Python数据分析----Python3操作Excel-以豆瓣图书Top250为例
  17. 徐荣谦《养好脾和肺 宝宝不积食不咳嗽长大个》【01】小儿常见病
  18. linux下HTK安装说明
  19. 公司申请高新认定需要有多少个软件著作权证书?
  20. 成年人的100个心酸瞬间:那些看似光鲜亮丽职业的背后......

热门文章

  1. ArcGIS 10.4.1 Desktop 完整安装教程
  2. 逻辑斯蒂回归、朴素贝叶斯
  3. C语言运算符优先级关系表
  4. 【智慧养殖】生猪叫声的福利监测研究进展与挑战
  5. 破解公司打卡app失败
  6. UG NX二次开发(C#)-建模-判断一条曲线是不是封闭
  7. 吴恩达机器学习python作业之多变量线性回归
  8. malloc动态创建二维数组(C语言)
  9. 关于我用xhtmlrenderer将html转换img结果样式飞了的这档事
  10. BeautifulSoup4解析器