什么是单例设计模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
饿汉单例设计模式
一上来我就把对象给你 new 好了,你来了直接就拿来使用了
/**
* ClassName: Singleton
* Description:
* date: 2022/2/26 20:39
*
* @version JDK 1.8
* @author: lisu
*/
public class Singleton {
private final static Singleton single = new Singleton() ;
// 把构造方法设计成私有 防止外部实例化
private Singleton() {}
// 给外部返回实例用的
public static Singleton getInstance() {
return single ;
}
}
优点:线程安全。
缺点:一开始就把实例load到内存。,当系统中这样的类较多时,会使得启动速度变慢 。
懒汉单例设计模式
你要使用我再来实例化,否则我就不实例化
/**
* ClassName: Singleton
* Description:
* date: 2022/2/26 20:39
*
* @version JDK 1.8
* @author: lisu
*/
public class Singleton {
private static Singleton single ;
// 把构造方法设计成私有 防止外部实例化
private Singleton() {}
// 给外部返回实例用的
public static Singleton getInstance() { //对获取实例的方法进行同步
if (single == null) {
synchronized (Singleton.class) {
if (single == null) {
single = new Singleton();
}
}
}
return single;
}
}
静态内部类设计模式
这个实现方法保证了线程安全和性能。
/**
* ClassName: Singleton
* Description:
* date: 2022/2/26 20:39
*
* @version JDK 1.8
* @author: lisu
*/
public class Singleton {
// 把构造方法设计成私有 防止外部实例化
private Singleton() {}
// 把实例放在内部类里面,这样JVM及帮我们实现线程安全,也防止了一开始就加载到内存
private static class SingletonHolder {
private static final Singleton Sington=new Singleton();
}
// 给外部返回实例用的
public static Singleton getInstance() { //对获取实例的方法进行同步
return SingletonHolder.Sington;
}
}
第一次加载Singleton类时不会去初始化Sington,只有第一次调用getInstance,虚拟机加载SingletonHolder并初始化Sington,这样不仅能确保线程安全,也能保证 Singleton 类的唯一性。所以,推荐使用静态内
枚举单例设计模式
在《effective java》中说道,最佳的单例实现模式就是枚举模式。利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题。除此之外,写法还特别简单。
import org.omg.CORBA.PUBLIC_MEMBER;
/**
* ClassName: SingletonEnum
* Description:
* date: 2022/2/26 20:56
*
* @version JDK 1.8
* @author: lisu
*/
public enum SingletonEnum {
INSTALL ;
public void doThings() {
System.out.println("do......");
}
}
调用方法如下
/**
* ClassName: SingletonEnumTest
* Description:
* date: 2022/2/26 20:57
*
* @version JDK 1.8
* @author: lisu
*/
public class SingletonEnumTest {
public static void main(String[] args) {
SingletonEnum.INSTALL.doThings();
}
}