(01)单例模式

概念

单例模式让类只能new一个对象,使得每次从类中拿到的对象都是同一个对象。

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

实现方式

饿汉式

在成员变量中创建对象

/**
 * 单例-饿汉式
 */
public class Demo {
    private static final Demo instance = new Demo();

    private Demo() {
    }

    public static Demo getInstance() {
        return instance;
    }
}

懒汉式

在需要对象的时候,再进行创建。

  • 懒汉式需要双重if判断
  • 懒汉式需要加锁,锁是类的字节码文件
  • 需要加volatile关键字,禁止指令重排,否则可能会拿到成员变量未初始化的对象
/**
 * 单例-懒汉式
 */
public class Demo {
    private static volatile Demo instance;

    private Demo() {
    }

    public static Demo getInstance() {
        if (instance == null) {
            synchronized (Demo.class) {
                if (instance == null) {
                    instance = new Demo();
                }
            }
        }
        return instance;
    }
}

枚举式(最完美的单例模式)

  • 懒汉式/饿汉式虽然不可以new一个新的对象,但是可以通过反射的方式创建对象
  • 枚举方式虽然也能通过反射的方式来创建对象,但是通过反射创建出来的枚举都会是同一个对象
/**
 * 单例-枚举方式
 */
public enum Demo {
    instance;

    public void m() {
        System.out.println("调用了m方法");
    }

    public static void main(String[] args) {
        Demo.instance.m();
    }
}
posted @ 2021-11-19 20:10  、嘎路的米。  阅读(43)  评论(0)    收藏  举报