Java-单例模式

我的博客园:https://www.cnblogs.com/djhzzl/p/14378952.html

单例模式

单例(Singleton)模式是设计模式之一,最显著的特点就是一个类在一个JVM中只有一个实例,避免繁琐的创建销毁实例。


public class Singleton_Test {
    private Singleton_Test(){
        System.out.println("私有化构造方法");
    }
}

在这里插入图片描述
构造方法私有化(private),外部无法new实例化。


所以提供一个public static 方法 getInstance(),外部通过这个方法获取对象,并且由于是 实例化的同一个类,所以外部每次调用都是调用同一个方法,从而实现一个类只有一个实例。

    public static void main(String args[]) {
        Singleton_Test test1 = Singleton_Test.getInstance();
        Singleton_Test test2 = Singleton_Test.getInstance();

        System.out.println(test1 == test2);
        /*输出
        私有化构造方法
        true
         */
    }

实例化的是同一个类,只调用一次构造方法。


饿汉式

这种方式无论是否调用,加载时都会创建一个实例。

    private static Singleton_Test Instance = new Singleton_Test();

    public static Singleton_Test getInstance(){
        return Instance;
    }

懒汉式

这种方式,是暂时不实例化,在第一次调用发现为null没有指向时,再实例化一个对象。

    private static Singleton_Test Instance ;

    public static Singleton_Test getInstance(){
        if (Instance == null){
            Instance = new Singleton_Test();
        }
        return Instance;
    }

区别

  • 饿汉式的话是声明并创建对象(他饿),懒汉式的话只是声明对象(他懒),在调用该类的 getInstance() 方法时才会进行 new对象。

  • 饿汉式立即加载,会浪费内存,懒汉式延迟加载,需要考虑线程安全问题 什么是线程安全/不安全

  • 饿汉式基于 classloader 机制,天生实现线程安全,懒汉式是线程不安全。需要加锁 (synchronized)校验等保证单例,会影响效率

单例模式要点

  • 构造方法私有化
    private Singleton_Test(){}

  • 私有静态(static)类属性指向实例
    private static Singleton_Test Instance

  • 使用公有静态方法返回实例
    public static Singleton_Test getInstance(){ return Instance;}

你可能感兴趣的:(Java,设计模式,java)