1.为什么要有单例模式(单例模式的意义)
2.单例模式的应用场景
3.单例模式怎样实现(饿汉模式,懒汉模式)
4.饿汉模式和懒汉模式的区别
5.推荐使用的懒汉模式(静态内部类)
6.静态内部类如何实现延迟加载
一、单例模式的意义
单例模式是设计模式,而设计模式,是被反复使用的,多人知晓的代码设计经验总结,作用是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。
单例模式的意义:唯一的一个,为了保证唯一性,保证整个项目中类的实例对象有且只有一个。
二、单例模式的应用场景
应用场景:配置文件,工具类,线程池,日志对象等等
三、单例模式怎样实现(饿汉模式,懒汉模式)
JAVA通过在类中自己实现类的实例对象,通过提供get方法提供调用(有默认的构造方法就会被不断的实例,所以要先私有化构造方法,使其内部自己创建对象)
饿汉模式:静态成员在类加载时就被创建,一开始就加载到内存中,没被调用就创建,没饿就开始吃了,称为饿汉模式
1.私有化构造方法
2.创建私有类实例对象
3.通过公有静态get方法来提供访问
package com.singleton;
public class Singleton {
// 私有化默认的构造方法
private Singleton() {
}
// 内部创建私有静态类实例对象
private static Singleton instane = new Singleton();
// 静态厂方法提供外部调用
public static Singleton getInstane() {
return instane;
}
}
懒汉模式(延迟加载):当类加载时不创建实例,当第一个用户调用时才创建,后面调用都是调用第一次被创建的。
1.将构造方法私有化(不允许被外部调用)
2.声明私有静态实例
3.通过静态get方法来提供访问
a.为空则创建实例对象
b.不为空则直接返回回声明类对象
package com.singleton;
public class Singleton {
// 私有化默认的构造方法
private Singleton() {
}
// 声明内部私有静态类实例
private static Singleton instane;
// 静态厂方法提供外部调用 ,延迟加载
public static Singleton getInstane() {
if (instane == null) {
instane = new Singleton();
}
return instane;
}
}
四、饿汉模式和懒汉模式的区别
饿汉模式,加载类时创建唯一实例,加速速度慢,运行时获取对象速度快,线程安全
懒汉模式,加载类速度快,第一次运行时加载速度慢,线程不安全
五、推荐使用的懒汉模式(静态内部类)
静态内部类,类加载时静态内部类不同时加载,调用时才加载,所以可用在懒汉模式上,使其线程安全
package com.singleton;
public class Singleton {
// 私有化默认的构造方法
private Singleton() {
}
// 静态厂方法提供外部调用 ,延迟加载
private static class lazy {
private static Singleton instane = new Singleton();
}
// 静态厂方法提供外部调用 ,延迟加载
public static Singleton getInstane() {
return lazy.instane;
}
}
六、静态内部类如何实现延迟加载
静态内部类,类加载时静态内部类不同时加载,调用时才加载
package com.singleton;
public class TestSingleton {
public static void main(String[] args) {
TestSingleton test = new TestSingleton();
System.out.println("-----------------------------");
TestSingleton.Test.Test2(); // 调用内部类的静态方法
}
static class Test {
static {
System.out.println("延迟加载");
}
static void Test2() {
System.out.println("调动加载");
}
}
static {
System.out.println("加载");
}
}