单例模式是开发中常用的模式,同时也是面试中设计模式里出现最频繁的一个。最近找工作梳理知识点,将自己的理解整理如下,如有错误愿虚心请教~
首先单例模式的目的就是系统中某个组件可能只需要一个,并且仅需要一个,如果这种组件出现多个的话可能造成系统的混乱,那么这时就需要一个单例来保证“单例”只会有一个。
单例模式:确保一个类只有一个实例,并提供一个全局的访问点。【head first】
下面介绍几种单例的设计方式:
1,“急切”的创建实例
public class Singleton {
private static final Singleton uniqueInstance = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return uniqueInstance;
}
}
这种方式就是直接在类初始化的时候就将单例对象进行实例化,需要获取单例对象的都需要调用getInstance()方法。这就要求这样的单例对象不会占用太对的系统空间,并且系统空间允许这样的对象在一开始就进行实例化。但这个方式有一个明显的缺点就是:java中经常遇到序列化和反序列化,如果单纯使用这个Singleton会造成反序列化的时候产生多个单例对象。所以需要对这个方法进行优化。
2,“急切”的创建实例-优化01
public class Singleton implements Serializable{
private static final Singleton uniqueInstance = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return uniqueInstance;
}
//为了防止反序列化时产生多个实例对象,导致假冒的单例
private Object readResolve(){
return uniqueInstance;
}
}
public enum Singleton implements Serializable{
INSTANCE;
private String field;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
这是实现单例模式最优的方式
3,同时实现单例模式还有慢实例化,代码如下,这种方式应注意线程安全。
public class Singleton {
private static Singleton uniqueInstance;
private Singleton(){};
//第一种方式
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
//双重检查加锁
public class Singleton3 {
private volatile static Singleton3 uniqueInstance;
private Singleton3(){};
public static Singleton3 getInstance(){
if(uniqueInstance == null){
synchronized(Singleton3.class){
if(uniqueInstance == null)
uniqueInstance = new Singleton3();
}
}
return uniqueInstance;
}
}