1.静态内部类实现

在上一版的时候用的是懒汉和饿汉来做单例模式,如果我们采用静态内部类的话,就可以通过classloader来懒加载单例 用静态内部类实现单例模式:

public class Singleton {private static class LazyHolder {private static final Singleton INSTANCE = new Singleton();}private Singleton (){}public static Singleton getInstance() {return LazyHolder.INSTANCE;}
}
复制代码

这里有几个需要注意的点:

1.从外部无法访问静态内部类LazyHolder,只有当调用Singleton.getInstance方法的时候,才能得到单例对象INSTANCE。

2.INSTANCE对象初始化的时机并不是在单例类Singleton被加载的时候,而是在调用getInstance方法,使得静态内部类LazyHolder被加载的时候。因此这种实现方式是利用classloader的加载机制来实现懒加载,并保证构建单例的线程安全。

2.反射机制打破单例

//获得构造器
Constructor con = Singleton.class.getDeclaredConstructor();
//设置为可访问
con.setAccessible(true);
//构造两个不同的对象
Singleton singleton1 = (Singleton)con.newInstance();
Singleton singleton2 = (Singleton)con.newInstance();
//验证是否是不同对象
System.out.println(singleton1.equals(singleton2));
复制代码

代码可以简单归纳为三个步骤:

第一步,获得单例类的构造器。

第二步,把构造器设置为可访问。

第三步,使用newInstance方法构造对象。

最后为了确认这两个对象是否真的是不同的对象,我们使用equals方法进行比较。毫无疑问,比较结果是false。

3.用枚举实现单例模式(最佳):

JVM的enum语法糖会阻止枚举类的私有构造方法,缺点是不能懒加载

    enum Color {RED(1),GREEN(2),BLUE(3);private int code;Color(int code){this.code=code;}public int getCode(){return code;}}
复制代码

####4. 总结:

####5. 补充:

使用枚举实现的单例模式,不但可以防止利用反射强行构建单例对象,而且可以在枚举类对象被反序列化的时候,保证反序列的返回结果是同一对象。

对于其他方式实现的单例模式,如果既想要做到可序列化,又想要反序列化为同一对象,则必须实现readResolve方法。

转自:https://mp.weixin.qq.com/s/AdJI5a4w515SPPI_4gVImA

转载于:https://juejin.im/post/5a31227e6fb9a0450f21f033

单例设计模式 (2)相关推荐

  1. python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件

    1.单例设计模式 单例设计模式就是为对象在内存中分配空间的时候,永远只会返回一个唯一的固定的内存空间.这样就能保证在内存中这个类的对象只有唯一的一份,这个就叫做单例.(为对象分配空间使用的是内置方法_ ...

  2. 单例设计模式详解。。。。。。。。。。。

    public class Demo01 { public static void main(String[] args) { // TODO Auto-generated method stub /* ...

  3. 对于java程序语言的单例设计模式讲解

    1.设计模式:解决某一类问题最行之有效的方法.(java中有23种通用设计模式) 单例设计模式:解决一个类在内存中只存在一个对象. 2.单例设计模式有两种方式: 1)饿汉式 先初始化对象.当类一进内存 ...

  4. java软件设计模式只单例设计模式

    概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计 ...

  5. AJPFX关于单例设计模式

    单例设计模式优势:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件时,建议配置文件封装成对象.会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中 ...

  6. java饿汉式有啥作用,Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?...

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的.如果重复 ...

  7. 单例设计模式singleton

    简单引入 单例设计模式作为最简单,最常用的设计模式.一般是这两中写法,这两种写法教科书所谓的标准写法,但是实际上存在不少问题.后面介绍标准写法,以规避这些问题. 1.懒汉式: /*** 问题在于,当多 ...

  8. 面向对象——单例设计模式

    单例设计模式: 解决一个类在内存只存在的一个对象 //getInstance()    返回对象 饿汉式:先初始化对象 class Si{ private static Si s=new SI(); ...

  9. Python单例设计模式

    (1)为什么使用设计模式? 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. (2)单例设计模式概念 让类创建的对象只有唯一的一个实例,即每次执行  类名() 返回的对象,内存地 ...

  10. java的单例设计模式

    java的单例设计模式包括:饿汉设计模式和懒汉设计模式: 步骤: 1.创建一个对象把他设置为私有的成员变量,保证唯一 2.私有构造方法,防止new一个对象. 3.定义一个公开的静态方法,返回第一步创建 ...

最新文章

  1. centos 安装java web_centos6.9 安装JAVA-WEB环境
  2. 华为认证数通专家HCIE-Datacom 11月30日发布
  3. matlab 返回变量类型的命令,MATLAB主要命令汇总
  4. jquery的懒加载记录一下踩得坑
  5. AD转换实验 编写程序利用ADC0804 AD转换器采集电位器的模拟电压,将采集到的数字量在程序中换算成实际采集的模拟电压,并用数码管显示所采集的实际模拟电压值。(如:AD转换后的数字量为128,则
  6. Java基础语法学习11——流程控制(循环)
  7. 成功网络管理员必备“软件”素质
  8. C++、C++-OpenCV、Python、Python-Numpy、MATLAB的除法取余(余数)方法总结
  9. (FPGA学习)环境及入门-------基于黑金FPGA cyclone IV EP4CE15F17开发板
  10. 阿里云网盘开启公测!不限速、2T永久免费空间!!
  11. VS2008创建C++项目
  12. element时间日期选择器组件设置默认时间
  13. excel如何拆分表格?
  14. Flutter 解决软键盘弹出背景图片变形
  15. 期权希腊字母更多的含义和解释
  16. python中str类型和object类型_pandas str和object类型之间的区别
  17. what Data Fabric
  18. 因果系列文章(2):因果推断初探
  19. 取消Vue中格式警告
  20. 解决ubantu 安装gitlab 失败 Unable to locate package gitlab-ce

热门文章

  1. java字节转xml_关于XML文档和JAVA中的JTree之间如何转换的问题
  2. Java render用法_SpringMVC ModelAndView的用法使用详解
  3. python中不可变对象_Python中的可变对象与不可变对象、浅拷贝与深拷贝
  4. html5 火焰效果图,css3火焰文字特效
  5. php函数clean(),wordpress函数clean_url()用法示例
  6. linux源码scripts目录是什么,linux-kernel – linux / scripts / recordmcount:没有这样的文件或目录...
  7. dz后台html,discuz X1.5 论坛后台站长常用操作小结
  8. Java数据结构Map List Set及Queue相关的类图
  9. 订餐系统项目中OrderForm、OrderDTO、OrderMaster和ResultVO的区别
  10. Flink学习笔记02:Flink三种运行模式