博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式]单例模式
阅读量:2215 次
发布时间:2019-05-07

本文共 2122 字,大约阅读时间需要 7 分钟。

单例模式(创建型模式)

核心作用

保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

优点

1 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决

2 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理

现实方式

主要:

•饿汉式(线程安全,调用效率高。但是,不能延时加载。)
•懒汉式(线程安全,调用效率不高。但是,可以延时加载。)
其他:
•双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
•静态内部类式(线程安全,调用效率高。但是,可以延时加载)
•枚举单例(线程安全,调用效率高,不能延时加载)

实际举例

饿汉式
public class SingletonDemo1 {	//类初始化时,立即加载这个对象(没有延时加载的优势)。加载类时,天然的是线程安全的!	private static SingletonDemo1 instance = new SingletonDemo1();  		private SingletonDemo1(){	}		//方法没有同步,调用效率高!	public static SingletonDemo1  getInstance(){		return instance;	}	}

懒汉式

public class SingletonDemo2 {		//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)。	private static SingletonDemo2 instance;  		private SingletonDemo2(){ //私有化构造器	}		//方法同步,调用效率低!	public static  synchronized SingletonDemo2  getInstance(){		if(instance==null){			instance = new SingletonDemo2();		}		return instance;	}	}

双重检测锁式

public class SingletonDemo3 {

private static SingletonDemo3 instance = null;   public static SingletonDemo3 getInstance() {     if (instance == null) {       SingletonDemo3 sc;       synchronized (SingletonDemo3.class) {         sc = instance;         if (sc == null) {           synchronized (SingletonDemo3.class) {             if(sc == null) {               sc = new SingletonDemo3();             }           }           instance = sc;         }       }     }     return instance;   }   private SingletonDemo3() {   }     }

静态内部类式

public class SingletonDemo4 {		private static class SingletonClassInstance {		private static final SingletonDemo4 instance = new SingletonDemo4();	}		private SingletonDemo4(){	}		//方法没有同步,调用效率高!	public static SingletonDemo4  getInstance(){		return SingletonClassInstance.instance;	}	}

枚举单例

public enum SingletonDemo5 {		//这个枚举元素,本身就是单例对象!	INSTANCE;		//添加自己需要的操作!	public void singletonOperation(){	}		}

如何解决反射和反序列化漏洞(枚举单例没有这两个漏洞)

反射:在private修饰的空参构造器中检测对象是否为空,若不为空抛出运行时异常

private SingletonDemo6(){ 	if(instance!=null){		throw new RuntimeException();	}}

反序列化:在类中增加readResolve()方法

private Object readResolve() throws ObjectStreamException{return instance;}

转载地址:http://inzfb.baihongyu.com/

你可能感兴趣的文章
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>
剑指offer 20.顺时针打印矩阵
查看>>
剑指offer 21.包含min函数的栈
查看>>
剑指offer 23.从上往下打印二叉树
查看>>
剑指offer 25.二叉树中和为某一值的路径
查看>>
剑指offer 60. 不用加减乘除做加法
查看>>