单例模式

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. 先静态、后动态
*/

你可能感兴趣的:(单例模式)