单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁 创建销毁的对象使用单例模式可以提高系统性能
当想实例化一个单例类的时候,必须要使用相应的获取对象的方法,而不是new
使用场景:需要频繁创建和销毁的对象,创建对象时耗时多或者耗费资源过多(重量级对象),但又经常用到的对象,工具类对象、频繁访问数据库或文件的对象(如数据源,session 工厂等)
双检索模式
package test.design;
/**
* 双检索模式
* @author fj
* @version 1.0
* @date 2020/11/13 10:13
*/
public class Singleton {
/**
* DCL 加volatile 禁止指令重排
*/
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
饿汉模式
package test.design;
/**
* 饿汉模式
* @author fj
* @version 1.0
* @date 2020/11/13 15:23
*/
public class Singleton1 {
private static final Singleton1 singleton = new Singleton1();
private Singleton1(){}
public static Singleton1 getSingleton(){
return singleton;
}
}
懒汉模式
package test.design;
/**
* 懒汉模式
* @author fj
* @version 1.0
* @date 2020/11/13 15:26
*/
public class Singleton2 {
private static Singleton2 singleton2 = null;
private Singleton2(){}
public static Singleton2 getSingleton2(){
if(singleton2==null){
return new Singleton2();
}
return singleton2;
}
}
内部类模式
package test.design;
/**
* 内部类模式
* @author fj
* @version 1.0
* @date 2020/11/13 15:35
*/
public class Singleton3 {
private static class SingletonHolder{
private static final Singleton3 singleton = new Singleton3();
}
private Singleton3(){}
public static final Singleton3 getSingleton(){
return SingletonHolder.singleton;
}
}
枚举模式
package test.design;
/**
* 枚举
* @author fj
* @version 1.0
* @date 2020/11/13 15:41
*/
public enum Singleton4 {
INSTANCE ;
}