我们来使用各种不同的方式来实现一下我们的单例模式吧!
主要有懒汉式和饿汉式
我们需要知道一些前提条件:
- 将我们构造器进行私有化(只能创建一个实例)
- 我们这个类自行创建(使用静态变量来完成)
3.必须向我们的整个系统提供这个实例,可以进行调用
饿汉式
第一种方式: 可以直接创建
public class Singleton{
public static final INSTANCE=new Singleton();
private Singleton(){
}
}
第二种方式:枚举类
需要知道的条件:
例如:
定义一个常量
默认
public static final T VARIABLE=new 实例;
代码实现:
public enum Singleton{
INSTANCE;
}
第三种方式:主要使用静态代码块,(这样的方式更适合一些复杂的初始化对象)
public class Singleton{
public static final INSTANCE;
static{
//这个过程可能是一个很复杂的过程
INSTANCE =new Singleton();
}
private Singleton(){
}
}
懒汉式
第一种方式:线程不安全的,使用于单线程
public class Singleton{
private static final instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance==null){
instance =new Singleton();
}
return instance;
}
}
第二种方式:线程安全,适用于多线程
public class Singleton{
private static final instance;
private Singleton(){
}
public static Singleton getInstance(){
//为了提高效率问题,已经创建了实例,就不用堵塞等待锁,优化效率
if(instance == null ){
//加上锁,解决线程不安全问题
synchronized(Singleton.class){
if(instance == null){
instance= new Singleton();
}
}
}
return instance;
}
}
第三种方式:静态内部类的形式来获取 (简洁,且没有线程安全问题)
public class Singleton{
private Singleton(){
}
//Singleton类加载时, 其静态内部类并不会加载, 只会第一次调用的时候进行加载
public static class Inner{
private static final instance =new Singleton();
}
public static Singleton getInstance(){
return Inner.instance ;
}
}