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

《java与模式》学习系列——单例模式

 

一、 单例模式的结构

单例模式有三个要点:

一是某个类只能有一个实例;

二是它必须自行创建这个事例;

三是它必须自行向整个系统提供这个实例。

 

饿汉式单例类

源代码如下:

 

特点:类被加载时,静态变量m_instance会被初始化,此时类的私有构造子会被调用,这时候类的惟一实例就被创建出来了。

懒汉式单例类

源代码如下:

 

特点:类被加载时,m_instance还会被初始化,只有第一次引用时才会被初始化。另外上面程序中对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用所谓的“双重检查成例”,必须指出的是,“双重检查成例”不可以在java语言中使用。

饿汉式与懒汉式的比较:

从资源利用效率角度:饿汉式单例类稍差些,因此饿汉式单例类在自己被加载时就将自己实例化了。

从速度和反应时间角度来讲:饿汉式单例类则稍好一些,因为懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题

从语言角度:饿汉式易于在java内实现,不易在c++中实现,因为静态初始化在c++里没有固定的顺序,可能会出现问题,因此在java中用饿汉式会好一些,在c++中用懒汉式好一些。

登记式单例类

克服饿汉式单例类及懒汉式单例类不可继承的缺点。

代码如下:

 

错误使用单例模式的两种情况:

1、不要用一个单例类盛放所有的“全程”变量,这不符合单例模式的三个条件,违反了单例模式的用意。一个设计得当的系统不应当有所谓的“全程”变量,这些变量应当放到它们所描述的实体所对应的类中去。将这些变量从它们所描述的实体类中抽出来,放到一个不相干的单例类中去,使得这些变量产生错误的依赖关系和耦合关系。

2、系统中管理与数据库的链接时,使用单例类包装一个Connection对象,并在finalize方法中关闭connection对象。这样做是不恰当的,除非有单一实例的需求,否则不要使用单例模式。在这里Connection对象可以同时有几个实例共存,不必是单一实例。

二、 单例模式在java中的应用

javaRuntime对象

java语言内部,java.lang.Runtime对象就是一个使用单例模式的例子。在每一个Java应用程序里面,都有惟一的一个Runtime对象。Runtime类提供一个静态工厂方法getRuntime()方法:public static Runtime getruntime();Runtime对象通常的用途包括:执行外部命令;返回现有内存即全部内存;运行垃圾收集器;加载动态库。

Introspector(自省)

Introspector类的构造子是私有的,一个静态工厂方法instantiate()提供了Introspector类的惟一实例。一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

 

相关文章:

  • UML中类之间的关系
  • 找出数组中两个只出现一次的数字
  • python学习之字典
  • 《java与模式》学习系列——适配器模式
  • javascript模板库jsrender加载并缓存外部模板文件
  • 《java与模式》学习系列——装饰模式
  • 初始化Git的配置
  • 《java与模式》学习系列——享元模式
  • Java WebService 简单实例
  • java.lang.instrument使用
  • 《java与模式》学习系列——门面模式
  • 《java与模式》学习系列——桥梁模式
  • 《java与模式》学习系列——观察者模式
  • angularjs服务-service
  • 《java与模式》学习系列——迭代子模式
  • create-react-app项目添加less配置
  • Invalidate和postInvalidate的区别
  • JS 面试题总结
  • leetcode-27. Remove Element
  • Linux CTF 逆向入门
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 记录一下第一次使用npm
  • 前端代码风格自动化系列(二)之Commitlint
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Nginx实现动静分离
  • ​一些不规范的GTID使用场景
  • #HarmonyOS:基础语法
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1)虚拟机的安装与使用,linux系统安装
  • (2)nginx 安装、启停
  • (30)数组元素和与数字和的绝对差
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • . Flume面试题
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net 中Partitioner static与dynamic的性能对比
  • .net分布式压力测试工具(Beetle.DT)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • :如何用SQL脚本保存存储过程返回的结果集
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @RequestMapping处理请求异常
  • [ IO.File ] FileSystemWatcher
  • [ 数据结构 - C++]红黑树RBTree
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [c#基础]DataTable的Select方法
  • [DevOps云实践] 彻底删除AWS云资源
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [HNOI2008]水平可见直线