单例即单实例,一个普通类可以创建任意个对象,而单例模式原则上有一个实例对象存在,那么单例模式的作用是什么呢?
减少不必要的对象创建,节约内存空间,既然一个对象就能搞定你要做的事情,干嘛要N个对象去做呢?就好比教室里的扫帚只有一把,而不需要每个学生都有一把,扫帚只有一把,谁需要用去拿就行了,这样就节约了资源!
一般工具类会设置成单例模式,下面以EncryptUtil类为例
既然是单例,那就要保证只有一个实例,实例是由构造器创建,所以要限制构造器不能任意创建实例
- 用
private
修饰构造器 - 在
EncryptUtil
类内部创建一个private
对象 - 提供能访问该对象的
public
方法
此3步即可实现单例模式
public class EncryptUtil {
private static EncryptUtil encryptUtil = new EncryptUtil();
private EncryptUtil(){}
public static EncryptUtil getEncryptUtil(){
return encryptUtil;
}
}
由于encryptUtil
实例是在EncryptUtil
类加载的时候就已经创建了,所以此方式称为饿汉式
,类一加载就创建了,那还不饥饿呀!
与之相对的就是懒汉式
了,只有需要用到的时候才去创建实例,即在调用getEncryptUtil
方法的时候再去创建实例
public class EncryptUtil {
private static EncryptUtil encryptUtil = null;
private EncryptUtil(){}
public static EncryptUtil getEncryptUtil(){
if (encryptUtil == null){
encryptUtil = new EncryptUtil();
}
return encryptUtil;
}
}
懒汉式
与饿汉式
最大区别是单实例先后创建的区别,既然是只有一个实例,先创建后创建区别也不大,先创建也不会说浪费多少内存,毕竟只有一个实例,而且懒汉式
会有线程安全问题,饿汉式
则不会有这个问题
if (encryptUtil == null){
encryptUtil = new EncryptUtil();
}
问题就出在这段代码,因为这里有2个步骤,先要判断if (encryptUtil == null)
,再创建实例encryptUtil = new EncryptUtil();
,不是原子操作,所以在多线程情况下会创建N个实例!
总结:单例模式就用饿汉式就ok了
其它设计模式不定时更新