@[toc]
什么是单例
保证一个类只有一个实例,并且提供一个访问该全局访问点
1.Windows的Task Manager(任务管理器)就是很典型的单例模式
2.windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例
3.数据库连接池,线程池,spring(默认单例模式)都是单例
为什么要设计成单例 ?单例的好处?优缺点?
**单例好处:节约内存,只有一个实例,重复利用,方便管理
缺点:线程安全问题**
单例创建方式
**1.饿汉式:类初始化时,会立即加载该对象,线程天生安全,调用效率高。
2.懒汉式: 类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象,具备懒加载功能。
3.静态内部方式:结合了懒汉式和饿汉式各自的优点,真正需要对象的时候才会加载,加载类是线程安全的。
4.枚举单例: 使用枚举实现单例模式 优点:实现简单、调用效率高,枚举本身就是单例,由jvm从根本上提供保障!避免通过反射和反序列化的漏洞, 缺点没有延迟加载。**
1.饿汉式实现
2.懒汉式实现
3.枚举创建单例
枚举--定义常量,天生具备JVM保障单例,一般项目定义常量
package com.dimple.Design;
public class SinEnum {
private SinEnum(){
}
public static SinEnum getInstance() {
return sinEnumPattern.INSTANCE.getInstance();
}
private static enum sinEnumPattern {
INSTANCE;
// 枚举元素为单例
private SinEnum sinEnum;
private sinEnumPattern() {
sinEnum = new SinEnum();
}
public SinEnum getInstance() {
return sinEnum;
}
}
public static void main(String[] args) {
SinEnum u1 = SinEnum.getInstance();
SinEnum u2 = SinEnum.getInstance();
System.out.println(u1 == u2);
}
}
如何选择单例创建方式
如果不需要延迟加载单例,可以使用枚举或者饿汉式,相对来说枚举性好于饿汉式。
如果需要延迟加载,可以使用静态内部类或者懒韩式,相对来说静态内部类好于懒韩式。