来源:拉勾教育Java就业集训营
单例设计模式的概念
在某些特殊场合中,一个类对外提供且只提供一个对象时,这样的类叫做单例类,而设计单例的流程和思想叫做单例设计模式。
单例设计模式的实现流程
- 私有化构造方法,使用private关键字修饰,防止外部实例化。
- 实例化本类类型的对象,保证只实例一次。
- 提供公有的get方法负责将对象返回出去,并使用public static关键字共同 修饰。
单例设计模式的实现方式
一.饿汉式
public class Singleton{
//1.私有化构造方法,使用private关键字修饰
private Singleton(){}
//2.声明本类类型的引用指向本类类型的对象 并封装 使用private static 共同修饰
private static Singleton sin=new Singleton();
//3.提供共有的get方法负责将对象返回出去
public static Singleton getInstance(){
return sin;
}
}
二.懒汉式(多线程会有线程不安全问题)
public class Singleton1{
//1.私有化构造方法,使用private关键字修饰
private Singleton1(){}
//2.声明本类类型的引用指向本类类型的对象 并封装 使用private static 共同修饰
private static Singleton1 sin=null;
//3.提供共有的get方法负责将对象返回出去
public static Singleton1 getInstance(){
if(null == sin){
sin=new Singleton1();
}
return sin;
}
}
三.线程安全的懒汉式(加锁解决线程安全问题)
public class Singleton{
private Singleton(){}
private static volatile Singleton sin=null;
public static Singleton getInstance(){
if(null == sin){
synchronized (Singleton.class){
if(null == sin){
sin=new Singleton();
}
}
}
return sin;
}
}
四.静态内部类实现单例模式(静态内部类加载的时候,初始化instance实例,只初始化一次,虚拟机的类加载机制保证线程安全)
public class Singleton {
public static Singleton getInstance(){
return SingleHolder.instance;
}
private Singleton(){ }
private static class SingleHolder{
private static Singleton instance=new Singleton();
}
}
五.枚举单例模式(利用枚举的特性实现单例)
public class Singleton {
public static Singleton getInstance(){
return SingleEnum.SINGLE.getIns();
}
private enum SingleEnum{
SINGLE;
private Singleton ins=null;
SingleEnum() {
ins=new Singleton();
}
private Singleton getIns(){
return ins;
}
}
}