设计模式-单例模式

饿汉模式最简单:

public class Singleton {

// 首先,将 new Singleton() 堵死

private Singleton() {};

// 创建私有静态实例,意味着这个类第一次使用的时候就会进行创建

private static Singleton instance = new Singleton();

public static Singleton getInstance() {

return instance;

}

// 瞎写一个静态方法。这里想说的是,如果我们只是要调用 Singleton.getDate(...),

// 本来是不想要生成 Singleton 实例的,不过没办法,已经生成了

public static Date getDate(String mode) {return new Date();}

}

很多人都能说出饿汉模式的缺点,可是我觉得生产过程中,很少碰到这种情况:你定义了一个单例的类,不需要其实例,可是你却把一个或几个你会用到的静态方法塞到这个类中。

饱汉模式最容易出错:

复制代码
public class Singleton {
    // 首先,也是先堵死 new Singleton() 这条路
    private Singleton() {}
    // 和饿汉模式相比,这边不需要先实例化出来,注意这里的 volatile,它是必须的
    private static volatile Singleton instance = null;

    public static Singleton getInstance() {
        if (instance == null) {
            // 加锁
            synchronized (Singleton.class) {
                // 这一次判断也是必须的,不然会有并发问题
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

双重检查,指的是两次检查 instance 是否为 null。

volatile 在这里是需要的,希望能引起读者的关注。

很多人不知道怎么写,直接就在 getInstance() 方法签名上加上 synchronized,这就不多说了,性能太差。

嵌套类最经典,以后大家就用它吧:

复制代码

public class Singleton3 {

private Singleton3() {}

// 主要是使用了 嵌套类可以访问外部类的静态属性和静态方法 的特性

private static class Holder {

private static Singleton3 instance = new Singleton3();

}

public static Singleton3 getInstance() {

return Holder.instance;

}

}

注意,很多人都会把这个嵌套类说成是静态内部类,严格地说,内部类和嵌套类是不一样的,它们能访问的外部类权限也是不一样的。

最后,我们说一下枚举,枚举很特殊,它在类加载的时候会初始化里面的所有的实例,而且 JVM 保证了它们不会再被实例化,所以它天生就是单例的。

虽然我们平时很少看到用枚举来实现单例,但是在 RxJava 的源码中,有很多地方都用了枚举来实现单例。

相关推荐
isTrueLoveColour1 小时前
java设计模式--结构型模式
java·开发语言·设计模式
咩咩大主教1 小时前
C++设计模式2:代理模式
linux·服务器·c语言·开发语言·c++·设计模式·代理模式
不是仙人的闲人6 小时前
C++ 设计模式——组合模式
c++·设计模式·组合模式
lucky.帅13 小时前
使用C#的异步和依赖注入实现网络数据存储
开发语言·数据库·后端·设计模式·c#·.net·visual studio
Fuliy9614 小时前
游戏开发设计模式之迭代器模式
java·开发语言·算法·unity·设计模式·迭代器模式
叫我龙翔15 小时前
【Linux】线程池项目详解
java·linux·运维·服务器·c++·单例模式
澄澈i17 小时前
设计模式学习[4]---依赖倒置原则+里氏代换原则
学习·设计模式·依赖倒置原则
Shinka-深深1 天前
《图解设计模式》笔记(三)生成实例
笔记·设计模式
为美好的生活献上中指1 天前
Java学习Day33:HTML 第四章:大战虎先锋(js)
java·开发语言·javascript·学习·算法·设计模式·html
疾风终究没有归途1 天前
观察者模式解析:实现对象间的舞蹈同步!
观察者模式·设计模式·工作原理·依赖关系·对象同步·状态更新·代码灵活性