JAVA学习*单列模式
概念
单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点(提供一个公开的方法)来获取这个实例。
饿汉式
代码展示:
public class EagerInitialization {
private static EagerInitialization instance = new EagerInitialization();
private EagerInitialization() {
}
public static EagerInitialization getInstance() {
return instance;
}
}
public class Test {
public static void main(String[] args) {
EagerInitialization instance1 = EagerInitialization.getInstance();
EagerInitialization instance2 = EagerInitialization.getInstance();
System.out.println(instance1 == instance2);
}
}
输出:
true
代码解释:
1、 为了只能实例化一个对象,此时将构造方法变成私有的,在类外就无法实例化对象。
2、 在类内创建了一个对象,设为私有(封装实例,控制访问:外部代码无法直接访问或修改该变量),同时提供一个能得到对象的接口(方法)。
3、 使用static修饰这个对象,使其在类加载时就会初始化且被创建一次。
4、 通过 private 对构造方法和实例变量的双重控制,从 “禁止外部创建” 和 “封装内部实例” 两个维度,严格保障了单例模式 “全局唯一实例” 的特性。
5、 在应用程序启动时就进行单列对象的初始化,无论是否被使用过。但当对象一直没有被使用过,可能会浪费系统资源,占用内存。
懒汉式
代码展示:
public class LazyInitialization {
private static LazyInitialization instance;
private LazyInitialization() {
}
public static LazyInitialization getInstance() {
if(instance == null) {
instance = new LazyInitialization();
}
return instance;
}
}
public class Test {
public static void main(String[] args) {
LazyInitialization instance1 = LazyInitialization.getInstance();
LazyInitialization instance2 = LazyInitialization.getInstance();
System.out.println(instance1 == instance2);
}
}
输出:
true
代码解释:
1、 相比饿汉式来说,这个只有在首次使用时才创建实例。
2、 为了只能实例化一个对象,此时将构造方法变成私有的,在类外就无法实例化对象。
3、 使用private和static修饰instance,使其封装和创建一次。初始为null
4、 对于if语句就是检查instance是否为null,即是否已经创建过实例了。如果没有就创建实例。当创建了实例,返回存储的实例(并没有再次创建实例进行返回)。
5、 这段代码线程不安全,具体的改进后面会学习。