单例模式
2020-09-30 本文已影响0人
台风口的猪
1.保证从系统启动到系统停止,全过程只会产生一个实例
2.当我们在应用中遇到功能性冲突的时候,需要使用单例模式
/**
* 懒汉式(静态内部类)
*/
public class SinglePattern {
/**
* 将默认构造器私有化
*/
private SinglePattern() { }
/**
* 1. 可以先声明一个静态内部类 (解决反射破坏问题)
* 2, 也可以不使用静态内部类 直接使用 private static final SinglePattern SINGLE_PATTERN = new SinglePattern();
* 然后在getInstance()方法中直接 return SINGLE_PATTERN;
* private 私有保证别人不能修改
*
*/
public static class LazyHolder{
// final 为了防止内部误操作,代理模式,Cglib的代理模式,如果不是final子类是可以重新赋值的
private static final SinglePattern SINGLE_PATTERN = new SinglePattern();
}
/**
* 同样提供静态方法获取实例
* final 确保别人不能覆盖
* @return
*/
public static final SinglePattern getInstance(){
// 静态方法中的逻辑,是要在用户调用的时候才开始执行的
// 方法中实现逻辑需要分配内存,也是调用时才分配的
return LazyHolder.SINGLE_PATTERN;
// return SINGLE_PATTERN;
}
//不管该class有没有实例化,static静态块总会在classLoader执行完以后,就加载完毕
static{
// 静态块中的内容,只能访问静态属性和静态方法
// 只要是静态方法或者属性,直接可以用Class的名字就能点出来
// JVM内存中的静态区,这一块的内容是公共的,与静态方法不同,静态代码块不管是否调用就直接在加载完毕后分配内存空间,放在那里
}
}
/*
* 类装载到JVM中的过程
// 1. 从上往下
// 2. 先属性、后方法
// 3. 先静态、后动态
*/