单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
在没有使用单例模式情况下是这样的
class A{ private A() {} //构造方法私有化 public static A method() { return new A(); } }public class Test { public static void main(String[] args) { System.out.println(A.method()); //打印地址 System.out.println(A.method()); }}
这样的话每次都会重新开辟一块堆内存
可以看出是两个地址。
而使用了单例模式后
class A{ private static A a; //创建类的私有属性 懒汉模式 private A() {} //构造方法私有化 public static A method() { if(a == null) { //判断,如果a为空,则创建实例,如果a不为空,则直接返回a a = new A(); } return a; } }public class Test { public static void main(String[] args) { System.out.println(A.method()); //打印地址 System.out.println(A.method()); }}
打印的地址就是同一个地址了,也就是同一块堆内存
单例模式有两种最简单的写法,上面这种是懒汉模式,另一种是饿汉模式
class A{ private static final A a = new A(); //直接在定义属性的时候实例化 饿汉模式 private A() {} //构造方法私有化 public static A method() { return a; } }public class Test { public static void main(String[] args) { System.out.println(A.method()); //打印地址 System.out.println(A.method()); }}
输出的地址也是同一块
那么懒汉模式跟饿汉模式有什么区别呢?
懒汉模式
在类加载时,不创建实例,因此类加载速度快,但运行获取对象的速度慢
饿汉模式
在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快