首先要理解单例模式的意义,以及使用场景(这需要实战经验,多看代码,看别人在什么时候使用了单例模式,思考为什么在那里使用单例模式)。而这是最难的,一定要多总结,把所有遇到的单例模式的情景都可以总结进来
然后要知道单例模式的特点,理解什么样的定义是单例模式
最后要会写单例模式
一、单例模式特点
1、单例类只能有一个实例
2、单例类必须自己创建自己唯一的实例
3、单例类必须给所有其他对象提供该实例
二、单例模式的几种写法
懒汉式单例
// 懒汉式单例,在第一次调用时实例化自己
public class Singleton{
private Singleton(){}
private static Singleton single = null;
// 静态工厂方法
public static Singleton getInstance(){
if(single == null) {
single = new Singleton();
}
return single;
}
}
二、饿汉式单例
public class Singleton{
private Singleton(){}
private static final Singleton single = new Singleton();
public static Singleton getInstance(){
return single;
}
}
饿汉式在类初始化时就已经创建好一个静态实例供系统使用,以后不再改变,所以天生是线程安全的。
三、饿汉式和懒汉式的区别
1、饿汉式就是一旦类加载,就将单例初始化完成,保证getInstance()时,单例已经存在。
2、懒汉式就是比较懒,只有在调用getInstance()时,才会去初始化单例。
再从以下两点区分这两种创建单例的方式
(一)从线程安全来看:
饿汉式是天生线程安全的,可以放心的在多线程中使用。
懒汉式是非线程安全的,需要通过代码实现线程安全,有以上列出的几种写法,这几种写法在资源加载和性能上有一定的区别。
(二)从资源加载和性能来看
饿汉式在类创建的同时,就已经完成单例的初始化,不管以后会不会用到该单例对象,都会占用一定的内存,但相应的,在第一次调用时也会更快,因为已经资源加载完成。