一、单例模式

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("加载");
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值