热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式:闲谈单例模式

大家可能都看过单例模式的几种写法,其中饿汉式最简单,懒汉式中双重check最为复杂。双重che

大家可能都看过单例模式的几种写法,其中饿汉式最简单,懒汉式中双重check最为复杂。双重check需要考虑多线程同步,变量的可见性。还有的要求设置构造器为private。

麻烦!麻烦!超麻烦!单例是什么?字面上理解,一个实例。那这个一个实例是指使用一个实例,还是整个进程中只有一个实例?我的理解是使用同一个实例。


那private还有意义吗?阻止外部存在实例?反射怎么办?


 再说懒汉模式,延时加载。到底延时什么?是想在调用getInstance方法时在实例化?饿汉模式难道不是!懒汉模式的延时是为了等待其它数据的就绪。也就说,只有当需要外部资源才能完成实例化的时候,懒汉模式才有意义。


解释一下为什么饿汉模式也是延时加载。当一个类被使用时,它才会被加载,完成成员变量的初始化。看下面两个类:

public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
    private Singleton(){
        System.out.println("Singleton实例化了");
    }
    public static Singleton getInstance(){
        return INSTANCE;
    }
}
public class Main {
    public static void main(String[] args{
        System.out.println("Main start");
        Singleton.getInstance();
    }
}

运行Main类的结果是:

Main start
Singleton实例化了

由于类的这个特性,可以使用内部类持有当前类实例的。并且需要等待的其它数据也可以进行传递,彻底抛弃双重check的写法。


说了这么多,感觉还是Spring的单例好,没这么多事。




本篇到此结束,如果读完觉得有收获的话,欢迎点赞、关注、加公众号【贰级天災】,查阅更多精彩历史!!!



推荐阅读
author-avatar
米粒尖尖果儿_445
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有