设计模式-单例模式

嚴華  论坛元老 | 2024-7-17 17:09:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1016|帖子 1016|积分 3048

饿汉模式最简单:
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();}
}
许多人都能说出饿汉模式的缺点,可是我觉得生产过程中,很少碰到这种环境:你定义了一个单例的类,不需要其实例,可是你却把一个或几个你会用到的静态方法塞到这个类中。
饱汉模式最轻易出错:
  1. public class Singleton {
  2.     // 首先,也是先堵死 new Singleton() 这条路
  3.     private Singleton() {}
  4.     // 和饿汉模式相比,这边不需要先实例化出来,注意这里的 volatile,它是必须的
  5.     private static volatile Singleton instance = null;
  6.     public static Singleton getInstance() {
  7.         if (instance == null) {
  8.             // 加锁
  9.             synchronized (Singleton.class) {
  10.                 // 这一次判断也是必须的,不然会有并发问题
  11.                 if (instance == null) {
  12.                     instance = new Singleton();
  13.                 }
  14.             }
  15.         }
  16.         return instance;
  17.     }
  18. }
复制代码
双重检查,指的是两次检查 instance 是否为 null。

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

许多人不知道怎么写,直接就在 getInstance() 方法签名上加上 synchronized,这就不多说了,性能太差。
嵌套类最经典,以后大家就用它吧:
[code][/code] public class Singleton3 {

    private Singleton3() {}
    // 主要是使用了 嵌套类可以访问外部类的静态属性和静态方法 的特性
    private static class Holder {
        private static Singleton3 instance = new Singleton3();
    }
    public static Singleton3 getInstance() {
        return Holder.instance;
    }
}
留意,许多人都会把这个嵌套类说成是静态内部类,严格地说,内部类和嵌套类是不一样的,它们能访问的外部类权限也是不一样的。
末了,我们说一下摆列,摆列很特殊,它在类加载的时间会初始化里面的所有的实例,而且 JVM 保证了它们不会再被实例化,所以它天生就是单例的。

固然我们平常很少看到用摆列来实现单例,但是在 RxJava 的源码中,有许多地方都用了摆列来实现单例。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表