单例模式是23中设计模式的一种,其中单例模式又可以简单的划分为饿汉式和懒汉式。接下来针对这两种方式的实现方式进行详细的讲解。
饿汉式:1、构造方法私有;2、将类进行实例化,并设置为私有的类变量。
懒汉式:1、构造方法私有;2、需要进行类的声明,但不需要实例化,需要设置私有的类变量。
二者的区别:饿汉式是在类加载时就把类的实例创建出来,所有加载慢,但是运行快,而且是线程安全的;懒汉式是在第一 次 调用类的实例时才创建类的实例,所有类加载快,运行的速度慢,线程不安全。
饿汉式的具体实现的案列如下:
class Singleton {
private Singleton() {} //构造方法私有
private static Singleton instance = new Singleton(); //进行类的实例化,且设置为私有的类变量
public static Singleton getInstance() { //提供外界访问实例的方法
return instance;
}
}
private Singleton() {} //构造方法私有
private static Singleton instance = new Singleton(); //进行类的实例化,且设置为私有的类变量
public static Singleton getInstance() { //提供外界访问实例的方法
return instance;
}
}
懒汉式的实现案例:
public class Singleton2 {
private Singleton2() { } //构造方法私有
private static Singleton2 single; //声明类,却不实例化
public static Singleton2 getInstance() { //提供外界访
if (single == null) {
single = new Singleton2();
}
return single;
}
private Singleton2() { } //构造方法私有
private static Singleton2 single; //声明类,却不实例化
public static Singleton2 getInstance() { //提供外界访
if (single == null) {
single = new Singleton2();
}
return single;
}
}
判断类是否长生单一实例的判断的方法
//饿汉式
Singleton s = Singleton.getInstance();
Singleton s2= Singleton.getInstance();
System.out.println(s==s2); //判断是否输出true即可
//懒汉式
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
System.out.println(s3==s4); //判断是否输出true即可
Singleton s = Singleton.getInstance();
Singleton s2= Singleton.getInstance();
System.out.println(s==s2); //判断是否输出true即可
//懒汉式
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
System.out.println(s3==s4); //判断是否输出true即可