单例模式
一个类,在一个JVM里,只有一个实例存在
饿汉式单例模式
起初思路是私有化其构造方法,使得外部无法通过new得到新的实例
饿汉式通过先私有化构造方法,然后提供类属性(指向一个实例化对象),就解决掉了如何在类的实例化过程中解决掉有且仅有一个对象的问题,最后提供获取返回该对象的public static方法,这样就外部调用该对象的通道就打开了。
代码如下:
//举例用的是王者荣耀中的主宰(主宰就是一只)
public class Dragon{
//私有化
private Dragon(){}
//提供类属性
public static Dragon instance = new Dragon();
//提供类方法 给调用者获取该对象
public static Dragon getInstance(){
return instance;
}
}
//测试结果
public class TestDragon{
public static void main(String[] args){
//通过实例化会报错
//Dragon g1 = new Dragon;
//调用类.类方法去获取该对象
Dragon g1 = Dragon.getInstance();
Dragon g2 = Dragon.getInstance();
//都是同一个对象
System.out.println(g1==g2);
}
}
懒汉式单例模式
懒汉式单例模式是只有在调用getInstance方法时,才会创建实例
public class Dragon{
//私有化
private Dragon(){}
//提供类属性 用于指向实例对象 但是指向null
public static Dragon instance;
//public static方法,返回实例对象
public static Dragon getInstance(){
//第一次访问的时候发现没有instance,没有指向任何对象,这时实例化一个对象
if (null==instance){
instance = new Dragon();
}
//返回instance对象
return instance;
}
}
二者分别使用场景
饿汉式是立即加载的方法,无论是否使用该对象,都会加载
当然假如在构造方法里写了性能消耗大,占时久的代码,如建立与数据库的连接之类的,在启用的时候会感觉卡顿
懒汉式延迟加载也就是使用时才会加载,而且有线程安全的考虑
一般看业务需求,若有充分的启动和初始化时间,就用饿汉,要不然就用懒汉